This repository contains all 5 certification projects completed for the freeCodeCamp Front End Development Libraries certification β covering React.js, state management, third-party library integration, audio APIs, and real-time UI patterns.
Unlike earlier certifications focused on HTML and CSS, every project here is a fully functioning React application β managing component state, responding to user events, integrating external libraries, and passing a suite of automated specification tests defined by freeCodeCamp.
Each project has a live demo deployed on CodeSandbox and was independently designed and coded to satisfy freeCodeCampβs user story requirements β the same kind of acceptance criteria used in professional frontend development workflows.
| Category | Skills |
|---|---|
| React.js | Functional components, useState, useEffect, event handlers, props |
| State Management | Complex multi-field state, derived state, conditional rendering |
| JavaScript ES6+ | Arrow functions, destructuring, template literals, spread operator |
| Third-Party Libraries | marked.js for Markdown parsing, HTML5 Audio API |
| Real-Time UI | setInterval for live countdown, dynamic DOM updates on every tick |
| Audio Integration | HTML5 Audio element, play(), pause(), currentTime reset |
| Formula Logic | Multi-operator calculator with precedence and consecutive-key handling |
| CSS3 | Flexbox layout, responsive design, interactive hover states |
| Specification Testing | All projects pass freeCodeCampβs automated user story test suite |
React app that fetches and displays random quotes with Twitter sharing.
A clean, centered quote display application that shows a random quote and its author on load, generates a new quote on button click, and allows sharing the current quote directly to Twitter via a pre-filled tweet link.
π Live Demo: Open in CodeSandbox
| # | Requirement | Status |
|---|---|---|
| 1 | Wrapper element with id quote-box containing all elements |
β |
| 2 | Element with id text displaying the quote |
β |
| 3 | Element with id author displaying the quoteβs author |
β |
| 4 | Clickable element with id new-quote to fetch a new quote |
β |
| 5 | Clickable element with id tweet-quote to share on Twitter |
β |
| 6 | Random quote and author displayed on initial load | β |
| 7 | Clicking new-quote updates both quote text and author |
β |
| 8 | Clicking tweet-quote opens Twitter with the current quote |
β |
| 9 | quote-box is horizontally centered in the viewport |
β |
| Feature | Implementation Detail |
|---|---|
| Quote state | useState holds { text, author } object; updated on button click |
| Twitter link | Dynamically constructed https://twitter.com/intent/tweet?text=... URL |
| Random selection | Math.floor(Math.random() * quotes.length) on each button click |
| Centered layout | CSS Flexbox on body with min-height: 100vh |
Key Skills: React useState Β· Dynamic URL construction Β· Twitter Web Intent API Β· Conditional rendering Β· Flexbox centering
Real-time Markdown editor with live GitHub-flavored HTML preview using marked.js.
A split-panel Markdown editor where every keystroke in the editor textarea instantly updates the HTML preview panel. Ships with a default Markdown document on load demonstrating headings, bold, code blocks, links, lists, images, and blockquotes.
π Live Demo: Open in CodeSandbox
| # | Requirement | Status |
|---|---|---|
| 1 | textarea element with id editor for Markdown input |
β |
| 2 | div element with id preview displaying rendered HTML |
β |
| 3 | preview updates dynamically as user types in editor |
β |
| 4 | GitHub-flavored Markdown rendered using marked.js library |
β |
| 5 | editor contains default Markdown content on load |
β |
| 6 | Default Markdown renders as HTML in preview on load |
β |
| Feature | Implementation Detail |
|---|---|
| Real-time parsing | marked.parse(markdownText) called on every onChange event |
| Safe HTML render | dangerouslySetInnerHTML= with sanitized output |
| Default content | Pre-loaded Markdown string covering all major GitHub Markdown features |
| Split layout | CSS Flexbox two-column layout; responsive single column on mobile |
Key Skills: marked.js integration Β· dangerouslySetInnerHTML Β· Controlled textarea with onChange Β· Real-time derived state Β· Responsive split-panel layout
Interactive drum pad with both click and keyboard trigger support.
A 9-pad drum machine where each pad plays a unique audio clip when clicked with a mouse or triggered by its corresponding keyboard key (Q, W, E, A, S, D, Z, X, C). The display updates in real time to show the name of the currently playing sound.
π Live Demo: Open in CodeSandbox
| # | Requirement | Status |
|---|---|---|
| 1 | Outer container with id drum-machine |
β |
| 2 | Element with id display showing current audio clip name |
β |
| 3 | 9 clickable .drum-pad elements with key labels Q W E A S D Z X C |
β |
| 4 | Each pad contains an <audio> element with class clip and matching id |
β |
| 5 | Clicking a pad plays its corresponding audio clip | β |
| 6 | Pressing the mapped keyboard key triggers the corresponding pad | β |
| 7 | Display updates with the audio clip name when triggered | β |
| Feature | Implementation Detail |
|---|---|
| Audio playback | document.getElementById(key).play() + currentTime = 0 for instant replay |
| Keyboard events | useEffect adds keydown listener; cleans up on unmount |
| Display state | useState updated on every pad trigger with clip name |
| Pad data | Array of { key, id, src, label } objects mapped to components |
Key Skills: HTML5 Audio API Β· keydown event listener with useEffect cleanup Β· currentTime reset for overlapping playback Β· Data-driven component rendering Β· Real-time display state
Formula-logic React calculator with full operator precedence and edge-case handling.
A fully functional arithmetic calculator supporting addition, subtraction, multiplication, and division. Implements formula logic β meaning the full expression is evaluated on pressing equals β with proper handling of consecutive operators, leading zeros, single decimal point per number, and chained calculations.
π Live Demo: Open in CodeSandbox
| # | Requirement | Status |
|---|---|---|
| 1 | Clickable element with id equals |
β |
| 2 | Clickable number buttons 0β9 with specific IDs | β |
| 3 | Clickable operator buttons +, -, *, / with specific IDs |
β |
| 4 | Clickable decimal button | β |
| 5 | Clickable clear button | β |
| 6 | Display element with id display |
β |
| 7 | Clear resets calculator to initialized state | β |
| 8 | Numbers display as entered | β |
| 9 | Arithmetic on chained numbers returns correct result | β |
| 10 | Numbers do not begin with multiple leading zeros | β |
| 11 | Only one decimal point allowed per number | β |
| 12 | Decimal arithmetic supported | β |
| 13 | Consecutive operators: last operator entered is used (except negative sign) | β |
| 14 | Operator immediately after equals starts new calculation from result | β |
| 15 | Result provides several decimal places of precision | β |
| Feature | Implementation Detail |
|---|---|
| Formula evaluation | Full expression string built then evaluated with eval() (safely) on = press |
| Consecutive operators | Regex replaces multiple trailing operators; preserves negative sign (-) |
| Leading zero guard | Conditional prevents appending digit when display shows "0" |
| Single decimal guard | Checks current number segment for existing . before appending |
| Post-equals behavior | State flag justEvaluated routes next input to start fresh or chain |
Key Skills: Formula-logic evaluation Β· Expression string state Β· Edge-case input validation Β· Consecutive operator handling Β· React state machine pattern
Full-featured productivity timer with session/break cycling, audio alert, and pause/resume.
A Pomodoro technique timer with adjustable session length (1β60 min) and break length (1β60 min). Counts down in real time, automatically switches between session and break phases, plays an audio alert when a phase ends, and supports start, pause, resume, and full reset.
π Live Demo: Open in CodeSandbox
| # | Requirement | Status |
|---|---|---|
| 1β2 | break-label and session-label elements present |
β |
| 3β6 | Increment and decrement buttons for both break and session lengths | β |
| 7β8 | break-length defaults to 5; session-length defaults to 25 |
β |
| 9 | timer-label indicates active phase (Session / Break) |
β |
| 10 | time-left displays remaining time in mm:ss format |
β |
| 11β12 | start_stop and reset buttons present and functional |
β |
| 13β16 | Increment/decrement buttons update respective lengths correctly | β |
| 17 | Session and break lengths cannot be set to β€ 0 | β |
| 18 | Session and break lengths cannot be set to > 60 | β |
| 19 | Clicking start_stop starts countdown from current session length |
β |
| 20 | time-left updates every second while timer is running |
β |
| 21 | Clicking start_stop while running pauses the countdown |
β |
| 22 | Clicking start_stop while paused resumes from where it stopped |
β |
| 23β24 | When session reaches zero, break countdown begins automatically | β |
| 25β26 | When break reaches zero, session countdown begins automatically | β |
| 27β28 | Audio alert plays when countdown reaches zero (β₯ 1 second) | β |
| 29 | Reset stops timer, restores defaults, clears time-left display |
β |
| Feature | Implementation Detail |
|---|---|
| Countdown engine | setInterval in useEffect; clears interval on pause or unmount |
| Phase switching | When timeLeft === 0, flips currentPhase state between "Session" and "Break" |
| mm:ss formatting | Math.floor(seconds / 60) and seconds % 60 padded with .toString().padStart(2, "0") |
| Audio alert | useRef on <audio> element; .play() on zero, .pause() + currentTime = 0 on reset |
| Length guards | Math.max(1, ...) and Math.min(60, ...) clamp increment/decrement values |
| Pause/Resume | Boolean isRunning state; interval created or cleared based on state toggle |
Key Skills: setInterval with useEffect cleanup Β· Phase-switching state machine Β· mm:ss time formatting Β· useRef for audio control Β· Clamped numeric input Β· Multi-field state management
| Project | Live Demo | Tech |
|---|---|---|
| π² Random Quote Machine | CodeSandbox β | React, CSS3 |
| π Markdown Previewer | CodeSandbox β | React, marked.js |
| π₯ Drum Machine | CodeSandbox β | React, Audio API |
| π’ Calculator | CodeSandbox β | React, ES6+ |
| β±οΈ Pomodoro Clock | CodeSandbox β | React, Audio API |
The freeCodeCamp Front End Development Libraries certification demonstrates the ability to build real, interactive React applications that handle complexity beyond static HTML and CSS:
marked.js integrated cleanly into a React controlled component workflowcurrentTime reset, and useRef integration used across two projectsfront-end-development-libraries/
β
βββ 01-random-quote-machine/ β Live: codesandbox.io/p/sandbox/random-quote-generator-22nzhr
β βββ src/
β β βββ App.js
β β βββ index.js
β βββ public/
β βββ package.json
β
βββ 02-markdown-previewer/ β Live: codesandbox.io/p/sandbox/markdown-previewer-mp4t8v
β βββ src/
β βββ package.json
β
βββ 03-drum-machine/ β Live: codesandbox.io/p/sandbox/drum-machine-h6zxmv
β βββ src/
β βββ package.json
β
βββ 04-calculator/ β Live: codesandbox.io/p/sandbox/calculator-z9cjhx
β βββ src/
β βββ package.json
β
βββ 05-pomodoro-clock/ β Live: codesandbox.io/p/sandbox/25-5-clock-pomodoro-timer-t2ndtf
β βββ src/
β βββ package.json
β
βββ README.md
# Clone this repository
git clone https://github.com/NarendraKoya999/freeCodeCamp-Frontend-Library-Certification.git
# Navigate to any project
cd freeCodeCamp-Frontend-Library-Certification/Javascript Calculator
# Install dependencies
npm install
# Start the development server
npm start
# App opens at http://localhost:3000
Prefer no setup? All five projects are live on CodeSandbox β click any link in the Live Demos table above to open and run instantly in the browser.