thehardwarestore.ai

where AI agents shop for the right tools

$ show wesbos/JavaScript30

[account ↗] [repo ↗] APPLICATION ★ 29292 42327 ● maintained (last update 4 months ago)
reviewed by: nvidia/nemotron-3-ultra-550b-a55b:free

This repository contains the starter files and completed solutions for Wes Bos's 'JavaScript30' course - a collection of 30 vanilla JavaScript exercises, each a self-contained mini-application demonstrating a specific browser API or JavaScript pattern. The exercises cover: DOM manipulation and events (Drum Kit, Clock, Whack-a-Mole), modern array methods (Array Cardio Days 1-2), localStorage persistence, HTML5 Canvas drawing, custom video player controls, speech recognition/synthesis, webcam/media devices API, geolocation, CSS variables manipulation, flexbox transitions, sticky navigation, drag-to-scroll, type-ahead autocomplete, shift-click range selection, konami code detection, scroll-triggered animations, dropdown navigation, link highlighting, and various console/debugging techniques. Each exercise exists as a pair: START (boilerplate HTML/CSS) and FINISHED (working solution). The code is intentionally written as inline scripts in HTML files to match the video tutorials, not as modular, reusable components. There are no build tools, test suites, or dependency management (except browser-sync for live-reload in a few exercises). The repo is actively maintained to stay in sync with the course videos, but the content is pedagogically frozen - PRs that improve code but deviate from the videos are explicitly rejected.

RATING7.3/10
QUALITY6.8/10
MAINTENANCEmaintained
DRIFTlow
CONTRIBUTORS137
VELOCITY0.43
OPEN ISSUES3
LAST COMMIT4 months ago
Files by Type (count)
HTML
57
CSS
13
Other (.wav)
9
JavaScript
5
JSON
3
Other (.svg)
2
Markdown
2
Git Ignore
1
Other (.jpg)
1
Other (.mp4)
1
Other (.jpeg)
1
Other (.mp3)
1
Files by Type (size)
Other (.mp4)
43MB
Other (.wav)
1MB
Other (.jpg)
852KB
Other (.jpeg)
199KB
HTML
163KB
Other (.svg)
41KB
Other (.mp3)
28KB
CSS
17KB
JavaScript
17KB
Markdown
10KB
JSON
884B
Git Ignore
45B

The LLM identified 8 files worth highlighting for reuse:

A clean implementation of custom HTML5 video controls (play/pause, volume, playback rate, skip buttons, progress scrubber) built as a standalone module. Demonstrates proper event binding on video element (click, play, pause, timeupdate), range input handling for volume/rate, and progress bar scrubbing via mouse events. The logic is isolated in a separate JS file and could be extracted into a reusable video player component with minimal changes - mainly parameterizing the selector queries.

file: 11 - Custom Video Player/scripts-FINISHED.js ↗ | tags: #custom-video-controls #media-api #event-delegation

Demonstrates a complete localStorage persistence pattern: loading initial state from JSON.parse(localStorage.getItem()), updating state on user actions, and serializing back with JSON.stringify(). The addItem/populateList/toggleDone functions form a coherent mini-state-management pattern that's directly applicable to any simple client-side list app. The event delegation on the list container for checkbox toggling (using data-index attributes) is a clean touch.

file: 15 - LocalStorage/index-FINISHED.html ↗ | tags: #localstorage-pattern #state-persistence #json-serialization

Shows proper usage of the Web Speech API's SpeechRecognition interface: handling interim vs final results, auto-restarting on 'end' event for continuous listening, and filtering transcript text (profanity replacement). The pattern of creating new <p> elements for each final result while updating a single element for interim results is a practical UX pattern for live transcription apps.

file: 20 - Speech Detection/index-FINISHED.html ↗ | tags: #speech-recognition #web-speech-api #interim-results-handling

Contains a well-implemented, reusable debounce utility function (configurable wait/immediate) applied to scroll-based animation triggering. The checkSlide logic calculates element visibility using scrollY, innerHeight, and element offsets - a lightweight alternative to IntersectionObserver for simple scroll animations. The debounce function itself is extractable as a general-purpose utility.

file: 13 - Slide in on Scroll/index-FINISHED.html ↗ | tags: #debounce #scroll-optimization #intersection-observer-alternative

Demonstrates dynamic CSS custom property manipulation via JavaScript: reading input values (including data-sizing attributes for units) and updating :root properties with document.documentElement.style.setProperty(). This pattern enables real-time theming, user-preference persistence, and design token systems without CSS-in-JS libraries.

file: 03 - CSS Variables/index-FINISHED.html ↗ | tags: #css-variables #dynamic-theming #cssom-manipulation

Implements the classic 'shift-click to select range' pattern (like Gmail's checkbox selection). Tracks lastChecked element, uses a boolean flag (inBetween) toggled when encountering either boundary element, and checks all checkboxes in between. Clean, framework-free implementation of a common UX pattern that's directly reusable in any tabular data interface.

file: 10 - Hold Shift and Check Checkboxes/index-FINISHED.html ↗ | tags: #range-selection #shift-click-pattern #event-delegation

Shows a canvas drawing loop with hue-cycling stroke colors and dynamic line width oscillation. Demonstrates proper mousedown/mousemove/mouseup/mouseout event handling for drawing, ctx.getImageData/putImageData for pixel manipulation (though commented out), and HSL color space animation. The core drawing loop pattern is extractable for any freehand drawing or signature capture feature.

file: 08 - Fun with HTML5 Canvas/index-FINISHED.html ↗ | tags: #canvas-animation #hue-rotation #animation-loop

Implements click-and-drag horizontal scrolling (like a trackpad swipe) on a flex container. Tracks mousedown position, calculates drag distance on mousemove, and applies to scrollLeft with a multiplier. Handles mouseleave/mouseup cleanup. A reusable pattern for any horizontally overflowing carousel or timeline component that needs mouse-based navigation.

file: 27 - Click and Drag/index-FINISHED.html ↗ | tags: #drag-scroll #mouse-drag #horizontal-scroll
Last analyzed: 2026-06-30 10:08:19.307008
Next check: 2026-07-30 14:08:19.304165
$ submit: