Table of contents
- Javascript and its ecosystem
 - 
        Js basics
        
- Linking your JavaScript file
 - Preparing your text editor
 - The Console
 - Comments
 - You don't need semicolon
 - Strings, numbers and booleans
 - Declaring variables
 - Functions
 - Arrow functions
 - Intro to objects
 - If/else statements
 - The NOT operator
 - Null and Undefined
 - The BOM and the DOM
 - Selecting an Element
 - Changing Classes
 - Listening to events
 - Callbacks
 
 - Building simple components
 - Arrays and loops
 - 
        Dom basics
        
- Id, classes, attributes, and tags
 - Changing CSS with JavaScript
 - Getting CSS with JavaScript
 - Changing Attributes
 - Finding an element's size and position
 - DOM Traversals
 - 🛠 Tabby: Building Tabby (A Tabbed component)
 - 🛠 Carousel: HTML and CSS
 - 🛠 Carousel: Switching slides with JavaScript
 - 🛠 Carousel: Working the dots
 - 🛠 Carousel: Positioning slides with JavaScript
 
 - Events deep dive
 - 
        Animations and transitions
        
- CSS Transitions
 - CSS Animations
 - Silky-smooth animations
 - Integrating CSS transitions and animations with JavaScript
 - JavaScript animations
 - GreenSock Animation API (GSAP)
 - 🛠 Off-canvas menu: Animations
 - 🛠 Modal: Animating the modal
 - 🛠 Modal: Animating the pointing hand
 - 🛠 Modal: Animating the waving hand
 - 🛠 Modal: Wave hand animation with JavaScript (using GSAP)
 - 🛠 Accordion: Animations
 - 🛠 Carousel: Animations
 
 - 
        Useful javascript features
        
- Ternary operators
 - AND and OR operators
 - Early returns
 - Template Literals
 - Destructuring
 - Default parameters
 - Enhanced Object Literals
 - Rest and Spread
 - Useful array methods
 - Reduce
 - Looping through objects
 - Returning objects with implicit return
 - 🛠 Accordion: Using useful JavaScript features
 - 🛠 Tabby: Using useful JavaScript features
 - 🛠 Carousel: Useful JavaScript features
 
 - 
        Javascript best practices
        
- Write declarative code
 - Functions with a purpose
 - Manage scope
 - Reduce state changes
 - Don't reassign
 - Don't mutate
 - Preventing Objects from mutating
 - Preventing Arrays from mutating
 - Write pure functions
 - 🛠 Accordion: Refactor
 - 🛠 Carousel: First refactor
 - 🛠 Carousel: Refactoring the dots part
 - 🛠 Carousel: Previous and next buttons
 - 🛠 Carousel: Second refactor
 
 - 
        Text and content
        
- Changing Text and HTML
 - Creating HTML Elements
 - Adding multiple elements to the DOM
 - Removing Elements from the DOM
 - 🛠 Carousel: Creating dots with JavaScript
 - 🛠️ Calculator: HTML and CSS
 - 🛠️ Calculator: Happy Path
 - 🛠️ Calculator: Testing the Happy Path
 - 🛠️ Calculator: Easy Edge Cases
 - 🛠️ Calculator: Difficult Edge Cases
 - 🛠️ Calculator: Refactoring
 - The switch statement
 - 🛠️ Calculator: Refactoring (Part 2)
 - 🛠️ Popover: Making one popover
 - 🛠️ Popover: Making four popovers
 - 🛠️ Popover: Making popovers with JavaScript
 
 - 
        Forms
        
- Intro to forms
 - Selecting form fields with JavaScript
 - Form fields and their events
 - Sanitize your output
 - Generating unique IDs
 - 🛠️ Popover: Dynamic ID
 - 🛠️ Todolist: The HTML and CSS
 - 🛠️ Todolist: Creating tasks with JavaScript
 - 🛠️ Todolist: Deleting tasks with JavaScript
 - 🛠️ Typeahead: The HTML and CSS
 - 🛠️ Typeahead: Displaying predictions
 - 🛠️ Typeahead: Selecting a prediction
 - 🛠️ Typeahead: Bolding search terms
 
 - 
        Dates
        
- The Date object
 - Getting a formatted date
 - Getting the time
 - Local time and UTC Time
 - Setting a specific date
 - Setting a date with Date methods
 - Adding (or subtracting) date and time
 - Comparing Dates and times
 - 🛠️ Datepicker: HTML and CSS
 - 🛠️ Datepicker: Building the calendar
 - 🛠️ Datepicker: Building the datepicker with JavaScript
 - 🛠️ Datepicker: Previous and Next buttons
 - 🛠️ Datepicker: Selecting a date
 - 🛠️ Datepicker: Positioning the datepicker
 - 🛠️ Datepicker: Showing and hiding
 - Formatting a date with toLocaleString
 - setTimeout
 - setInterval
 - 🛠️ Countdown timer: HTML and CSS
 - 🛠️ Countdown timer: JavaScript
 - 🛠️ Countdown timer: Counting Months
 - 🛠️ Countdown timer: Daylight Saving Time
 - 🛠️ Countdown timer: Counting Years
 
 - 
        Asynchronous javascript
        
- Introduction to Ajax
 - Understanding JSON
 - The Fetch API
 - Possible data types
 - JavaScript Promises
 - Requests and responses
 - Sending a POST request
 - Authentication
 - Handling errors
 - Viewing response headers
 - CORS and JSONP
 - XHR vs Fetch
 - Using an Ajax library
 - Reading API documentation
 - Understanding curl
 - 🛠️ Todolist: The Todolist API
 - 🛠️ Todolist: Fetching tasks
 - 🛠️ Todolist: Creating tasks
 - 🛠️ Todolist: Editing tasks
 - 🛠️ Todolist: Deleting tasks
 - 🛠️ Todolist: Creating tasks with Optimistic UI
 - 🛠️ Todolist: Handling Optimistic UI errors
 - 🛠️ Todolist: Editing tasks with Optimistic UI
 - 🛠️ Todolist: Deleting tasks with Optimistic UI
 - 🛠️ Todolist: Refactor
 - 🛠️ Typeahead: How to add Ajax
 - 🛠️ Typeahead: Adding Ajax
 - 🛠️ Typeahead: Handling errors
 - 🛠️ Google Maps Clone: Creating your first Google Map
 - 🛠️ Google Maps Clone: Fetching JSONP via JavaScript
 - 🛠️ Google Maps Clone: Drawing directions
 - 🛠️ Google Maps Clone: Driving directions
 - 🛠️ Google Maps Clone: Handling errors
 - 🛠️ Google Maps Clone: Adding stopovers
 - 🛠️ Google Maps Clone: Refactor
 
 - 
        Advanced asynchronous javascript
        
- Requesting many resources at once
 - Asynchronous functions
 - Handling multiple awaits
 - Asynchronous loops
 - 🛠️ Dota Heroes: Listing heroes
 - 🛠️ Dota Heroes: Filtering heroes (Part 1)
 - 🛠️ Dota Heroes: Filtering heroes (Part 2)
 - 🛠️ Dota Heroes: Refactoring
 - 🛠️ Dota Heroes: Hero Page
 - 🛠️ Dota Heroes: Making the hero page robust
 - 🛠️ Dota Heroes: Heroes page refactor
 
 - 
        Keyboard
        
- Keyboard users
 - Handling commonly used keys
 - Keyboard events
 - Understanding Tabindex
 - Detecting the focused element
 - Directing focus
 - Preventing people from tabbing into elements
 - How to choose keyboard shortcuts
 - Creating single-key shortcuts
 - 🛠️ Off-canvas: Adding keyboard interaction
 - 🛠️ Modal: Adding keyboard interaction
 - 🛠️ Accordion: Adding keyboard interaction
 - 🛠️ Tabby: Adding keyboard interaction
 - 🛠️ Tabby: Refactoring
 - 🛠️ Carousel: Adding keyboard interaction
 - 🛠️ Carousel: Displaying help text
 - 🛠️ Calculator: Adding keyboard interaction
 - 🛠️ Popover: Keyboard
 - 🛠️ Popover: Refactor
 - Keyboard shortcuts with Command and Control modifiers
 - 🛠️ Todolist: Keyboard
 - 🛠️ Typeahead: Keyboard
 - 🛠️ Typeahead: Selecting a prediction with the keyboard
 - 🛠️ Google Maps Clone: Keyboard
 - 🛠️ Dota Heroes: Keyboard
 - 🛠️ Datepicker: Tabbing in and out
 - 🛠️ Datepicker: Keyboard shortcuts
 
 - 
        Accessibility
        
- What is accessibility?
 - How to use a screen reader
 - Using NVDA
 - Using Voiceover
 - Aria roles
 - Landmark roles
 - Document structure roles
 - Live region roles
 - Widget roles
 - Window and Abstract roles
 - Accessible names and descriptions
 - Hiding content
 - ARIA properties and ARIA states
 - ARIA for expandable widgets
 - 🛠️ Off-canvas: Accessibility
 - ARIA for modal dialogs
 - 🛠️ Modal: Screen reader accessibility
 - 🛠️ Accordion: Screen reader accessibility
 - ARIA for Tabbed components
 - 🛠️ Tabby: Screen reader accessibility
 - 🛠️ Tabby: Refactor
 - 🛠️ Carousel: Screen reader accessibility
 - Roles that trigger Forms and Application modes
 - What's next for accessibility?
 
 - 
        Handling scroll
        
- The Scroll event
 - 🛠️ Auto-hiding Sticky-nav: HTML and CSS
 - 🛠️ Auto-hiding Sticky-nav: JavaScript
 - 🛠️ Auto-hiding Sticky-nav: Natural reveal
 - Intersection Observer API
 - Intersection Observer Options
 - 🛠️ Slide & Reveal
 - 🛠️ Slide & Reveal: Always fade-in when you scroll down
 - 🛠️ Slide & Reveal: Fine-tuning the animation
 - 🛠️ Infinite Scroll: Anatomy
 - 🛠️ Infinite Scroll: Infinite load
 - 🛠️ Infinite Scroll: Refactor
 - 🛠️ Infinite Scroll: Implementing the Infinite Scroll
 
 - 
        Mouse, touch, and pointers
        
- Mouse Events
 - 🛠️ Spinning Pacman: HTML and CSS
 - 🛠️ Spinning Pacman: JavaScript
 - Touch events
 - Pointer events
 - Touch-action
 - 🛠️ Spinning Pacman: Supporting Touch
 - Cloning elements
 - 🛠️ DragDrop: HTML and CSS
 - 🛠️ DragDrop: JavaScript
 - 🛠️ DragDrop: Creating a drop preview
 - 🛠️ DragDrop: Sortable drop preview
 - 🛠️ DragDrop: Robustness
 - 🛠️ DragDrop: Refactor
 
 - 
        Object oriented programming
        
- Before we begin
 - What is Object Oriented Programming?
 - Four Flavours of Object Oriented Programming
 - Inheritance
 - This in JavaScript
 - Call, bind, apply
 - Creating Derivative Objects
 - Composition vs Inheritance
 - Polymorphism
 - Encapsulation
 - Closures
 - Encapsulation in Object Oriented Programming
 - Getters and Setters
 - What OOP flavour to use
 - When to use Object Oriented Programming
 
 - 
        Writing reusable code
        
- Creating reusable code by writing libraries
 - Two Types of libraries
 - Including libraries with Script tags
 - Including libraries with ES6 Modules
 - Dynamic imports
 - 🛠️ Off Canvas: Building a Library
 - 🛠️ Modal: Library setup
 - 🛠️ Modal: Opening the Modal
 - 🛠️ Modal: Closing the modal
 - 🛠️ Modal: Inheritance and Polymorphism
 - 🛠️ Modal: Resolving differences between subclasses
 - 🛠️ Modal: Exposing properties and methods
 - 🛠️ Accordion: Building a library
 - 🛠️ Tabby: Building a library
 - 🛠️ Carousel: Building a library
 - 🛠️ Calculator: Library
 - 🛠️ Calculator: Fixing the Clear Key
 - 🛠️ Calculator: Handling other keys
 - 🛠️ Calculator: State
 - 🛠️ Popover: Library
 - 🛠️ Popover: Adding event listeners
 - 🛠️ Typeahead: Library
 - 🛠️ DatePicker: Library
 
 - 
        JS to frameworks
        
- 🛠️ Building a Tiny framework
 - 🛠️ Tiny: Add event listeners
 - 🛠️ Tiny: Updating state
 - 🛠️ Tiny: Rendering Child Components
 - 🛠️ Tiny: Changing Parent State
 - 🛠️ Tiny: Passing Props
 - 🛠️ Tiny: Multiple Props
 - 🛠️ Tiny: Passing values from sibling components
 - 🛠️ Tiny: Mounting
 - 🛠️ Tiny: Passing props to descendants
 - 🛠️ Tiny: A tiny refactor
 
 - 
        Single page apps
        
- What is a Single Page App?
 - Simple SPA using only CSS
 - The Location Interface
 - The History Interface
 - Minimum viable server for a SPA
 - 🛠️ Dota SPA: Introduction
 - 🛠️ Dota SPA: Building The Heroes List
 - 🛠️ Dota SPA: Building the filters
 - 🛠️ Dota SPA: Filtering heroes
 - 🛠️ Dota SPA: Displaying filtered heroes
 - 🛠️ Dota SPA: Getting Ready to build the Hero Page
 - 🛠️ Dota SPA: Building the hero page
 - 🛠️ Dota SPA: Lore and abilities
 - 🛠️ Dota SPA: Routing for Single-page apps