diff --git a/01 - JavaScript Drum Kit/index-START.html b/01 - JavaScript Drum Kit/index-START.html
index 4070d32767..ff418081a6 100644
--- a/01 - JavaScript Drum Kit/index-START.html
+++ b/01 - JavaScript Drum Kit/index-START.html
@@ -58,7 +58,23 @@
diff --git a/01 - JavaScript Drum Kit/index.html b/01 - JavaScript Drum Kit/index.html
new file mode 100644
index 0000000000..a365cfcd40
--- /dev/null
+++ b/01 - JavaScript Drum Kit/index.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+ Wes Bos Soundboard
+
+
+
+
+ Wes Bos Soundboard
+
+
+ A
+ Boo
+
+
+ S
+ Open Close
+
+
+ D
+ Scrolling
+
+
+ F
+ Trumpet
+
+
+ G
+ Woo
+
+
+ H
+ Awesome
+
+
+ J
+ I Like That
+
+
+ K
+ Embarassing
+
+
+

+
L
+
Turtle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/01 - JavaScript Drum Kit/main.css b/01 - JavaScript Drum Kit/main.css
new file mode 100644
index 0000000000..dc1a282a98
--- /dev/null
+++ b/01 - JavaScript Drum Kit/main.css
@@ -0,0 +1,143 @@
+html {
+ font-size: 10px;
+ background: url(https://i.imgur.com/b9r5sEL.jpg) bottom center;
+ background-size: cover;
+}
+
+body,html {
+ margin: 0;
+ padding: 0;
+ font-family: sans-serif;
+}
+
+h1 {
+ font-size: 7vw;
+ background: #000;
+ color: #fff;
+ padding: 1vh;
+ margin: 1vh 0 1vh;
+}
+
+.keys {
+ /* display: flex; */
+ /* flex: 1; */
+ min-height: 100vh;
+ align-items: center;
+ justify-content: center;
+}
+
+.key {
+ float: left;
+ border: .4rem solid black;
+ border-radius: .5rem;
+ margin: 1rem;
+ font-size: 1.5rem;
+ padding: 1rem .5rem;
+ transition: all .07s ease;
+ width: 10rem;
+ text-align: center;
+ color: white;
+ background: rgba(0,0,0,0.8);
+ text-shadow: 0 0 .5rem black;
+}
+
+.playing {
+ transform: scale(1.1);
+ border-color: #ffc600;
+ box-shadow: 0 0 1rem #ffc600;
+ background: rgba(0,0,0,0.7);
+}
+
+kbd {
+ display: block;
+ font-size: 4rem;
+}
+
+.sound {
+ font-size: 1.2rem;
+ text-transform: uppercase;
+ letter-spacing: .1rem;
+ color: #ffc600;
+}
+
+img.turtle {
+ display: none;
+ margin: 0 auto;
+ width: 5rem;
+}
+
+img.turtle.shake {
+ animation: 0.5s shake 1.6s linear 2;
+}
+
+@keyframes shake {
+
+ 10%,
+ 90% {
+ transform: translate3d(-1px, 0, 0);
+ }
+
+ 20%,
+ 80% {
+ transform: translate3d(2px, 0, 0);
+ }
+
+ 30%,
+ 50%,
+ 70% {
+ transform: translate3d(-4px, 0, 0);
+ }
+
+ 40%,
+ 60% {
+ transform: translate3d(4px, 0, 0);
+ }
+}
+
+/* Portrait */
+@media only screen
+ and (min-device-width: 375px)
+ and (max-device-width: 667px)
+ and (-webkit-min-device-pixel-ratio: 2)
+ and (orientation: portrait) {
+.key {
+ width: 33vw;
+ margin: 5vw 5vw 5vw 8vw;
+ }
+
+ kbd {
+ font-size: 5vh;
+ }
+
+ .sound {
+ font-size: 2vh;
+ }
+
+ img.turtle {
+ width: 23vw;
+ }
+}
+
+/* Landscape */
+@media only screen
+ and (min-device-width: 375px)
+ and (max-device-width: 667px)
+ and (-webkit-min-device-pixel-ratio: 2)
+ and (orientation: landscape) {
+ .key {
+ width: 18vw;
+ margin: 2vw 2vw 2vw 3vw;
+ }
+
+ kbd {
+ font-size: 8vh;
+ }
+
+ .sound {
+ font-size: 4vh;
+ }
+
+ img.turtle {
+ width: 10vw;
+ }
+}
\ No newline at end of file
diff --git a/01 - JavaScript Drum Kit/sounds/awesome.mp3 b/01 - JavaScript Drum Kit/sounds/awesome.mp3
new file mode 100644
index 0000000000..b38b457897
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/awesome.mp3 differ
diff --git a/01 - JavaScript Drum Kit/sounds/boo.mp3 b/01 - JavaScript Drum Kit/sounds/boo.mp3
new file mode 100644
index 0000000000..4276dfdcdf
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/boo.mp3 differ
diff --git a/01 - JavaScript Drum Kit/sounds/i-like-that.mp3 b/01 - JavaScript Drum Kit/sounds/i-like-that.mp3
new file mode 100644
index 0000000000..6b0559c06b
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/i-like-that.mp3 differ
diff --git a/01 - JavaScript Drum Kit/sounds/look-at-this-turtle.mp3 b/01 - JavaScript Drum Kit/sounds/look-at-this-turtle.mp3
new file mode 100644
index 0000000000..63b2bc9c6f
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/look-at-this-turtle.mp3 differ
diff --git a/01 - JavaScript Drum Kit/sounds/open-close.mp3 b/01 - JavaScript Drum Kit/sounds/open-close.mp3
new file mode 100644
index 0000000000..d9f54f9d75
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/open-close.mp3 differ
diff --git a/01 - JavaScript Drum Kit/sounds/scrolling.mp3 b/01 - JavaScript Drum Kit/sounds/scrolling.mp3
new file mode 100644
index 0000000000..953b6f06e8
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/scrolling.mp3 differ
diff --git a/01 - JavaScript Drum Kit/sounds/thats-embarassing.mp3 b/01 - JavaScript Drum Kit/sounds/thats-embarassing.mp3
new file mode 100644
index 0000000000..aa471bfe24
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/thats-embarassing.mp3 differ
diff --git a/01 - JavaScript Drum Kit/sounds/trumpet.mp3 b/01 - JavaScript Drum Kit/sounds/trumpet.mp3
new file mode 100644
index 0000000000..f376335af4
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/trumpet.mp3 differ
diff --git a/01 - JavaScript Drum Kit/sounds/woo.mp3 b/01 - JavaScript Drum Kit/sounds/woo.mp3
new file mode 100644
index 0000000000..d69259cb5a
Binary files /dev/null and b/01 - JavaScript Drum Kit/sounds/woo.mp3 differ
diff --git a/01 - JavaScript Drum Kit/turtle.png b/01 - JavaScript Drum Kit/turtle.png
new file mode 100644
index 0000000000..7b53615974
Binary files /dev/null and b/01 - JavaScript Drum Kit/turtle.png differ
diff --git a/01 - JavaScript Drum Kit/wes-sound-board.js b/01 - JavaScript Drum Kit/wes-sound-board.js
new file mode 100644
index 0000000000..29ac15094b
--- /dev/null
+++ b/01 - JavaScript Drum Kit/wes-sound-board.js
@@ -0,0 +1,76 @@
+console.log('This soundboard is a tribute to Wes Bos for his entertaining and accessible videos.');
+
+function playSound(soundKey) {
+ const audio = document.querySelector(`audio[data-key="${soundKey}"]`);
+ const key = document.querySelector(`div[data-key="${soundKey}"]`);
+ if (!audio) return;
+
+ // Match animation to the duration
+ key.setAttribute('style', `transition-duration: ${audio.duration}s`);
+
+ key.classList.add('playing'); // Highlight the currently playing sound
+ audio.currentTime = 0;
+ audio.play();
+
+ countdown(key, audio.duration); // Display a countdown
+
+ // Remove highlight after the effect finishes playing
+ audio.addEventListener('ended', function() {
+ key.classList.remove('playing');
+ });
+}
+
+// Displays a countdown while the audio clip plays
+function countdown(key, duration) {
+ let kbdTag = key.querySelector('kbd');
+
+ if (key.dataset.key != "76") { // Insert duration for non-turtle
+ kbdTag.innerHTML = duration.toFixed(1); // sound clips
+ }
+
+ timer = duration.toFixed(1);
+
+ function updateTimeLeft() {
+ timer -= 0.1;
+ if (key.dataset.key === "76") {
+ // When the turtle clip is played, display the turtle
+ kbdTag.style.display = 'none';
+ turtle();
+ } else {
+ kbdTag.innerHTML = timer.toFixed(1);
+ }
+
+ if (timer < 0) {
+ clearInterval(intervalId); // Stop updateTimeLeft() from running
+ if (key.dataset.key === "76") {
+ document.querySelector('.turtle').style.display = 'none';
+ kbdTag.style.display = 'block';
+ }
+ kbdTag.innerHTML = key.dataset.letter;
+ }
+ }
+
+ let intervalId = window.setInterval(updateTimeLeft, 100);
+}
+
+function turtle() {
+ let turtle = document.querySelector('.turtle');
+ turtle.style.display = 'inline-block';
+ turtle.classList.add('shake');
+}
+
+function handleKey(e) {
+ let soundKey = e.keyCode;
+ playSound(soundKey);
+}
+
+function handleClick(e) {
+ let soundKey = e.target.closest('div.key').dataset.key;
+ playSound(soundKey);
+}
+
+const keys = Array.from(document.querySelectorAll('.key'));
+
+// Handle keys and clicks
+window.addEventListener('keydown', handleKey);
+keys.forEach(key => key.addEventListener('click', handleClick));
\ No newline at end of file
diff --git a/02 - JS and CSS Clock/index.html b/02 - JS and CSS Clock/index.html
new file mode 100644
index 0000000000..ad2cfc70a8
--- /dev/null
+++ b/02 - JS and CSS Clock/index.html
@@ -0,0 +1,251 @@
+
+
+
+
+
+ JS + CSS Clock
+
+
+
+
+
+
+
+
+
+
+ - I
+ - II
+ - III
+ - IV
+ - V
+ - VI
+ - VII
+ - VIII
+ - IX
+ - X
+ - XI
+ - XII
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/03 - CSS Variables/index-START.html b/03 - CSS Variables/index-START.html
index 6b9b539c09..624a6f980f 100644
--- a/03 - CSS Variables/index-START.html
+++ b/03 - CSS Variables/index-START.html
@@ -1,9 +1,11 @@
+
Scoped CSS Variables and JS
+
Update CSS Variables with JS
@@ -21,6 +23,17 @@ Update CSS Variables with JS
-
+
+