
Explore 30 from-scratch projects in JavaScript and React, arranged from easy to hard, with each project first in JavaScript then in React and housed in its own folder.
Install the essential tools for this course by downloading Visual Studio Code and Node.js, enabling a text editor and a cross-platform JavaScript runtime to install packages for your projects.
Install three essential VSCode extensions for this project: Live Server for hot reloading, Prettier for code formatting, and Tailwind CSS IntelliSense for efficient Tailwind styling in React projects.
Set up a two-folder project structure for JavaScript and React, with HTML, CSS, and JavaScript in the JavaScript folder, and TypeScript in the React folder, shared styles, and app.tsx rendering.
Install essential packages with npm, create a React with TypeScript project, add Tailwind, configure tailwind.config.js and index.css, and run npm run dev to start a Tailwind-enabled React setup.
Build a React app layout with Tailwind and TypeScript, organizing an aside and main section using flex, 100vh height, and centered content, while styling reusable buttons with Tailwind's apply directive.
Let's create a hidden search box,
We will cover basics of Javascript, how to grab an html element and how to handle events like click.
Also how to animate using transition
We used state to manage the state of the search box.
We used "ref" to create a reference to the input to call native Javascript properties like focus.
Create a JavaScript version of a QR code generator that uses an external API to render the QR code from text input, with HTML structure and script setup.
Create a base.css with shared styles for inputs and buttons, set a font family, and implement hover effects; include the stylesheet in the index file to apply across projects.
Grab elements by id, add a click listener, and read the input. Validate input and render a QR code with the QR code JS library, clearing previous output with innerHTML.
Learn to build a React version by creating a TSX QR code generator, organizing components, and mapping through a component array with on click buttons to render component by index.
Learn to build a React and TypeScript QR code generator by wiring text input to state with useState, handling onChange, and rendering a QR code canvas from the react-qr-code package.
Build a password generator in a React project with lowercase, uppercase, numbers, and special characters, using a range 16–32 and a generate button to display the password.
Develop a client-side password generator with JavaScript, HTML, and CSS that includes lowercase, uppercase, numbers, and special characters, with a 16–32 length range and live password rendering.
Build a password generator in React by creating a reusable input component, wiring four inputs to shared useState, and updating option booleans like lowercase, uppercase, and numbers on change.
Learn to implement a range slider in React with state management, on change handling, and number parsing, then build a password generator interface with a button.
Build a password generator in a React project by selecting character types, wiring the generate function, and updating the displayed password based on user options.
Learn to build a password strength meter using a labeled input, a dynamic meter fill, and status text, with JavaScript and css to update strength as the user types.
create a dedicated style.css, define a class with height, width 100%, background color, border radius 5px, and margins, import in index, and style the fill element.
Develop a JavaScript password strength meter by selecting DOM elements, handling input events, computing strength, and updating the UI with classes, width percentages, and strength text.
Define a check password function that evaluates strength from zero to five using length, letters, uppercase, lowercase, numbers, and special characters with regex, then update weak, medium, and strong states.
Learn how to integrate a password strength component into a React project using TSX, Tailwind, and custom styles, including an input and a dynamic strength meter with a text label.
Define four levels with percentage, color, and text, initializing the level to zero with black. Update the level on input change and apply its color and width to the UI.
Create a text-to-speak feature by typing text into a text area and clicking a button to hear it spoken, while wiring up HTML elements and JavaScript to trigger speech.
Build a simple JavaScript interface with a text area and speak button. Use a click listener and the speech synthesis utterance API, with cancel to restart speech when needed.
In this React version, build a text-to-speech component by creating a controlled textarea, updating state on change, and wiring a speak button with Tailwind-styled elements.
Learn how to manage text input with useState in React TypeScript, update state on textarea changes, and trigger speech synthesis on button click with proper typing for React change events.
Build a circular progress component with CSS and JavaScript, featuring a data-value progress bar, simulate button actions, reset, and size options (small, medium, big) with CSS variables set from JavaScript.
Build a circular progress bar with a red background using a conic gradient, center content with a grid, and size it with a reusable size property ready for JavaScript-driven updates.
Learn to control a circular progress with vanilla JavaScript by selecting buttons, syncing a data-value attribute, mapping 0–100 to 0–360 degrees, and updating a CSS progress variable.
Implement button actions with click event listeners to set sizes (60, 100, 130 px) and a reset. Create a simulate download that increments by ten every 400 ms until 100.
Copy and adapt a circular progress component into a React project, wiring up useRef to control the progress element’s size with small, medium, and large presets.
Learn to implement a reset and simulated download progress in React using useState, useRef, and an interval, with cleanup on unmount and safe interval handling.
Implement a dark mode toggle in plain JavaScript, switch between light and dark themes, respect system preferences, apply transitions, and remember the last chosen theme on refresh.
Learn to implement a dark/light theme toggle with a click event, using the body class list, localStorage persistence, and browser preference via matchMedia to determine the initial theme.
Build a dark mode in React by creating a dark mode component, wiring a toggle on click, applying body styles, and centering content to demonstrate the toggle.
Develop a math captcha feature by generating two random numbers, validating user input, and displaying correct or retry feedback in a React setup.
Generate a dynamic captcha in JavaScript by creating two random numbers, display a question, verify input with parseInt, update messages, and regenerate on failure.
Learn to build a math captcha in React by generating two numbers, managing input and result state, and validating user answers with a dynamic render.
Create a dynamic shadow generator that uses sliders for horizontal and vertical offsets, blur and spread radii, a color picker, and an inset option to output CSS box-shadow values.
Build an interactive JavaScript shadow editor by wiring inputs with listeners, computing h-offset, v-offset, blur, spread, color, and inset, and updating the box shadow display and preview box.
Build a shadow generator in React with a custom hook and a range group component that renders sliders for horizontal and vertical offset, blur, and spread radius using unique ids.
Add and style color picker controls and shadow options, using inputs with specific IDs and class names, and a 400px width. Prepare to apply slider values to the box shadow.
Learn to manage shared state for multiple range groups in a React component by implementing a single state object, a centralized onChange handler, and proper typing for React change events.
Refactor a large component by extracting stateful logic into a custom hook that returns state and onChange, using the rest operator to pass remaining props for cleaner React code.
Master JavaScript and React by Building 30 Projects from Scratch
Course Overview: This course is designed to help you gain hands-on experience with JavaScript (vanilla JS) and React by building 30 projects from scratch. Each project will be built twice — once in vanilla JavaScript and then refactored into a React application using TypeScript and styled with Tailwind CSS. Through this process, you’ll develop a deep understanding of core JavaScript concepts while also learning how to effectively leverage React’s component-based architecture, state management, and modern tooling.
Why This Course?
Most courses focus solely on either vanilla JavaScript or React, leaving a gap in understanding when transitioning between them. This course fills that gap by providing a clear comparison of how to approach problems with and without frameworks. It’s the perfect course for developers who want to gain a deeper understanding of both JavaScript fundamentals and modern frontend development with React.
Students will leave this course with the confidence to build fully functioning web applications in either vanilla JS or React and the ability to understand when and why to use a framework like React for larger, scalable projects.
This structure ensures that students learn not only how to use JavaScript and React but also when and why each tool is best applied.
Who is this course for? This course is ideal for:
Beginner to intermediate developers who are comfortable with basic JavaScript and want to deepen their knowledge through hands-on practice.
Developers transitioning to React who already have experience in JavaScript but want to understand how React improves upon traditional development practices.
Aspiring frontend developers looking to enhance their portfolio with real-world projects and solidify their knowledge of modern frontend development.
Course Objectives: By the end of the course, you will:
Master vanilla JavaScript by building interactive projects from scratch.
Learn React with TypeScript by refactoring each project using a type-safe approach, improving both the scalability and maintainability of your applications.
Explore Tailwind CSS to create responsive, modern user interfaces quickly without the hassle of traditional CSS or external libraries.
Understand the key differences between vanilla JavaScript and React with TypeScript, and how React’s declarative nature and Tailwind’s utility-first approach can improve development speed and code structure.
Build a portfolio of 30 real-world projects, showcasing your proficiency in both JavaScript and the modern React ecosystem (with TypeScript and Tailwind CSS).
Course Structure:
This course is broken into 30 modules, with each module focusing on a unique project. The structure for each module is as follows:
Project Overview:
A brief explanation of the project, its use case, and expected features.
Key JavaScript concepts or React concepts that will be covered in the module.
Part 1: Building in Vanilla JavaScript
Step-by-step development process using only HTML, CSS, and JavaScript.
Focus on DOM manipulation, events, local storage, and other features of the tool.
Learn how to handle updates, and optimizations without external libraries.
Part 2: Refactoring in React
Step-by-step React implementation of the same project.
Focus on React components, hooks (such as useState, useEffect), JSX, and so forth.
Discuss the key differences from the vanilla JS version, and how React simplifies certain tasks.
Project Reflection and Comparison
A comparison of the codebases, highlighting the differences between vanilla JavaScript and React implementations.
Discussion of trade-offs in terms of performance, scalability, and code maintainability.
Key Benefits for Students:
Full Mastery of JavaScript and React: By building each project from scratch in both vanilla JavaScript and React, students will develop a strong command of both programming paradigms. They’ll understand the strengths and limitations of JavaScript, while gaining a deep appreciation for why React has become the go-to library for modern frontend development.
Practical, Hands-On Learning: The course emphasizes learning by doing, with 30 concrete projects that provide a balance of traditional JavaScript coding and modern React development. Each project builds on some specific feature, allowing students to incrementally improve their skills.
Improved Problem-Solving Skills: Tackling the same problem twice (once in vanilla JS and once in React) forces students to think critically about different ways to approach and solve coding challenges. They’ll learn how to weigh the trade-offs between different development approaches.
In-Depth Knowledge of React's Core Concepts: By transitioning from traditional JS to React, students will gain an in-depth understanding of key React concepts such as components, hooks, props, and state. This repeated exposure solidifies these concepts and makes students more comfortable using React in real-world scenarios.
Strong Foundation in Frontend Development: In addition to learning React, students will reinforce their understanding of the fundamentals of frontend development — DOM manipulation, event handling, CSS, and JavaScript features. This makes the course beneficial even for those just looking to solidify their JavaScript skills.
Preparation for Job Opportunities: The dual nature of the projects (in vanilla JS and React) equips students with a broader perspective on frontend development, making them more versatile in the job market. Employers often appreciate developers who understand both how applications are built from the ground up and how modern tools streamline the process.
Course Requirements:
Basic knowledge of CSS, JavaScript and react is needed.