Syllabus · Course book · Blog · Chapter 1 · Chapter 2 · Chapter 3 · Chapter 4 · Chapter 5 · Chapter 6 · Project · Assignments
Classroom version of the book, grouped by chapter and numbered book section. Open a deck to present slides on a wide stage. Keyboard: Left/Right or space change slides; Up/Down scroll the slide when content overflows (otherwise they also change slides). f or Present for fullscreen (phones use a viewport present mode). Esc or Back exits.
These slides are the classroom version of the matching book chapter. They are not a substitute for labs or the checklists on Assignments.
Lecture 1 setup first: Intro, Node.js, Next.js, GitHub, then Vercel. HTML and Kambaz follow.
18 decks
1 deck
Internet vs Web, browsers and URLs, client–server HTTP, framework history, and how we engineer large web apps in teams.
Install the Node LTS runtime, confirm node --version, create a course folder, and run hello.js.
Scaffold webdev-client with the App Router, replace the home page, add Lab 1, and link routes.
Install Git, keep node_modules out of the repo, create an empty GitHub.com repository, and push main.
Vercel.com account, import webdev-client from GitHub, Deploy, share the URL, turn off Vercel Authentication.
6 decks
Markup, hello.html, DOCTYPE/html/head/body, comments, whitespace, and the Window → Document DOM tree.
h1–h6 sizes, the Lab 1 wd-h-tag nest, and wrapping text in p (wd-p-2…wd-p-4) so vertical gaps stick.
ol vs ul, the pancake recipe, favorite-books ul, and a semantic quiz table (thead/tbody/tfoot/colSpan) — not layout.
Labels, text/password/textarea, buttons, file, radio vs checkbox, select one/many, and number/range/email/date.
href to other documents, mailto: and tel:, and same-page TOC hashes that match an element id.
Next.js Link TOC, labs layout children swap, and moving Kambaz into app/(kambaz)/ so it can own /.
Route group (kambaz) owns /, a landing page with wd-kambaz, a Labs TOC link, then redirect to Sign in.
Sign in, redirects, Profile, Sign up, Account Navigation, and a layout that keeps nav on the left.
Dashboard course cards with next/image, at least three published courses, and Sign in → /dashboard.
KambazNavigation sidebar, the (kambaz) layout table, and app/not-found.tsx for Calendar and Inbox.
Course screen at /courses/[cid]/home, Course Navigation sidebar, and await params in the layout.
Create the Modules nested list, Course Status sidebar, then Home as Modules plus Status.
Create the Assignments list and Assignment Editor — on your own, matching wd-* ids.
2.1 Styling React Components with CSS · 2.2 Decorating Documents with React Icons · 2.3 Styling Webpages with Tailwind CSS · 2.4 Styling Kambaz with CSS and Tailwind
21 decks
Style attribute vs imported CSS, tag / id / class / structure selectors, and how the cascade picks a winner.
Foreground color, background color, hex and named values, and stacking wd-fg-* / wd-bg-* classes.
Border, padding, margin, content-box vs border-box, and border-radius — the four layers of every box.
Width and height, display, then relative, absolute, fixed, and z-index from Lab 2 Positions.
float left/right, clear both, and percentage columns that fake a grid before flex.
display:flex rows, flex-grow for leftover space, and a pinned column from Lab 2 Flex.tsx.
Lab 2 @media breakpoints that restyle a demo at 750, 1000, and 1250 — CSS first, utilities later.
Optional extras: transform rotate plus linear and radial gradients. Not required for Lab 2.
Install react-icons, import families as components, and size them with className.
Utility-first mental model, Preflight vs scoped import, and the Lab 2 /tailwind route.
m-* and p-* with direction letters from TailwindSpacing.
text-* sizes and font-* weights from TailwindTypography.
bg-{color}-{shade} bands from TailwindBackgroundColors.
Five small responsive demos, then the Lab 2 card — color, show/hide, row, grid, spacing.
blur utilities, then grid-cols / col-span. A flex-class map follows.
Wire theme + utilities (no Preflight), kambaz.css, and a table-free Kambaz layout.
Fixed 120px icon sidebar, React Icons tiles, and wd-main-content-offset.
CourseCard borders and a 1/2/3/4-column responsive grid.
Course Navigation via kambaz.css list-group, Modules, Home flex, and hide-order.
People table utilities, AssignmentItem rows, and the On-your-own editor.
Sign in form utilities as the template for Sign up, Profile, and Account Nav.
3.2 Introduction to JavaScript · 3.3 JavaScript Functions · 3.4 JavaScript Data Structures · 3.5 TypeScript Types · 3.6 Dynamic Styling · 3.7 Client and Server Components · 3.8 Parameterizing Components · 3.10 Implementing a Data Driven Kambaz Application
23 decks
Why JS belongs in the page, ECMAScript vs TypeScript, and a Lab 3 stub you grow one component at a time.
var vs let vs const, interpolating values in JSX, and the first Lab 3 VariablesAndConstants component.
number, string, boolean, typeof, and why a bare boolean is invisible in JSX until you coerce it.
&& || ! and ===, then if/else, the ternary, and two ways to render a welcome vs login heading.
Assigned empty (null) vs never assigned (undefined), typeof quirks, and String() so they print.
1 deck
Legacy function add, ES6 arrows, implied return, and template literals with ${} and a ternary.
Gather values, print them in JSX, then length, indexOf, push, and splice.
A for loop builds a second array; map returns one — including a todo list of li.
find, findIndex, filter, then includes / some / every — the questions Kambaz asks of JSON.
reduce folds an array to one value; JSON.stringify puts brackets and commas back on the page.
A nested house object, pretty-printed JSON, and console.log in DevTools.
Spread copies (last write wins); destructing unpacks objects, arrays, props, and imports.
?. stops at missing; ?? fills a default only for null or undefined.
1 deck
Annotations, object types, unions, enums, typed props, narrowing, and utility types.
1 deck
Build className from a variable or ternary, then apply camelCase style objects.
"use client" for usePathname; omit it to read process and fs on the server.
Destructure props on Add, then children on Square and Highlight.
usePathname on the Labs TOC, [a]/[b] path params, map todos.json, then the complete Lab 3 page.
Map Kambaz Navigation from LINKS, then collect courses and related JSON under database/.
Map db.courses onto CourseCard, key by _id, and encode the course in the card href.
Await [cid], find the course, map course nav, and breadcrumb the last segment.
Filter modules by cid, map Module and Lesson with keys, optional-chain lessons.
Filter assignments, find the editor row, then join users to enrollments with some.
4.2 Managing State and User Input with Forms · 4.3 Sharing State, Prop Drilling, and URLs · 4.4 React Context · 4.5 Zustand · 4.7 Side Effects with useEffect · 4.9 Check Your Understanding · 4.10 Adding State to the Kambaz User Interface
19 decks
Lab 4 starts with "use client". onClick takes a function reference — parentheses fire during render.
Wrap a call in an arrow to pass an argument. Pass a parent function as a prop the child invokes on click.
A let stays at 7. useState returns a pair; the setter queues a render so the heading moves.
Boolean checked, string and date value/onChange, then spread objects and copy arrays.
Lift the counter to a parent and pass the value plus setter so the child can increment it.
A middle component that only forwards props is drilling. Query and path parameters carry the next page.
1 deck
A provider publishes a stable value. Right for who is signed in; wrong for lists every keystroke rewrites.
2 decks
create() returns a hook — no Provider. Select count, up, and down so only that field rerenders.
Array plus a draft in the store. Form and item call the hook — add, update, and delete without props.
Render computes JSX. useEffect runs after paint. The dependency array says when the title updates.
A custom hook is a use function that calls other hooks. It shares logic, not data, across components.
A 10-item self-check on events, useState, Context, Zustand, and useEffect before stateful Kambaz.
Dashboard useState alone would not name a new course on Home. Zustand holds the published list.
Select the store, keep a local form draft, Add a copy, Delete with preventDefault, Edit then Update.
A controlled ModuleEditor dialog, then modulesStore so Home sees the same array as Modules.
AccountProvider around the Kambaz layout. Sign in writes currentUser; Dashboard filters by enrollment.
Account Navigation and Profile read currentUser; AccountContext gains users so Sign up can create one.
An enrollments store, Enroll/Unenroll on each card, an All/Enrolled Dashboard, and a course layout guard.
The People table lists enrolled users and adds, edits, and deletes them through AccountContext.
5.1 Installing and Configuring an HTTP Web Server · 5.2 Lab Exercises · 5.3 Next.js Server Routes · Check Your Understanding · 5.4 Implementing the Kambaz Node.js HTTP Server · 5.5 Deploying to a Public Remote Server
14 decks
Sibling webdev-server, Hello.ts run by tsx, and Express GET /hello on port 4000.
Nodemon with tsx, "type": "module", npm scripts, tsconfig.json, then a typed Hello(app) extracted from index.ts.
5 decks
Two terminals, /lab5/welcome, and NEXT_PUBLIC_HTTP_SERVER.
Ways to send data: path params, query strings, and JSON bodies (in the Async HTTP and JSON deck). req.params vs req.query, .toString() on results, then multiply and divide on your own.
res.json an assignment, GET a property, then mutate title from the path.
CRUD on /lab5/todos — get all, get by id, then create and delete via GET first.
axios, CORS, a client library, express.json(), then POST / PUT / DELETE.
Same-origin /api/lab5/hello and a calculator Route Handler — not a replacement for Express.
1 deck
A 10-item self-check on Express setup, CORS, axios, and the Next.js calculator.
Copy Chapter 3 JSON into Kambaz/Database as export default modules.
Users DAO, POST signin/signup/profile/signout, axios, and setCurrentUser.
express-session, CORS credentials, req.session.currentUser, and axios withCredentials.
Courses DAO, GET enrolled courses, POST that enrolls the creator, modules on your own.
Second GitHub repo, Render npm start, then Vercel NEXT_PUBLIC_HTTP_SERVER.
6.1 Working with a Local MongoDB Instance · 6.2 Programming with a MongoDB Database · 6.2.6 Implementing APIs to Interact with MongoDB · 6.3 Integrating with MongoDB Hosted in Atlas Cloud Service · Check Your Understanding · 6.4 Integrating the Kambaz Web Application with a Database
12 decks
Install Community, Compass on 27017, create kambaz, then import the five JSON files.
Install mongoose, connect from env, User schema and model, then a promise DAO.
async account routes, GET /api/users, PeopleTable, and an ADMIN Users screen.
Filter by role and name, findById, then delete, $set update, and create.
Why Render cannot use 127.0.0.1, then a free Kambaz cluster and database user.
Paste the Compass mongodb+srv string, create kambaz, import the five JSON files.
0.0.0.0/0, Drivers URI with /kambaz?, new Render service, Vercel origin.
Five Render keys, secure cookies, then sign in so 12/7 graders read Atlas.
1 deck
A 10-item self-check on schemas, DAOs, async routes, and Atlas.
Course schema and model, then find / create / delete / update on Mongo.
One course, many modules — collection plus course foreign key, then CRUD.
Mapping collection, populate, deleteMany, enroll / unenroll, course People.
Integrating with the YouTube Video API · Integrating with the ChatGPT API · Integrating with the Grok API
9 decks
3 decks
Jose’s API / API Key sequence: Cloud project, credentials, .env, enable Data API v3 — no live keys.
SEARCH SCREEN: q/key/part, sample items, course nav, axios client, then cards.
DETAILS SCREEN, encode ?search=, VIDEO LESSONS, then STORE VIDEOS IN DB.
3 decks
GPT-4, tokens, prompt strategies, CONFIGURING OPENAI, then Hello World responses.create.
Pirate instructions, roles, vision, TTS, Structured Outputs, then moderation.
Chat bot, image UI, vision, TTS/STT, then Kambaz suggest course and module.
3 decks
TOKENS, API KEY, curl grok-4-latest, then generateText meaning-of-life.
CHAT completions, stateless roles, COURSE AI DESCRIPTION, then title sparkle.
GENERATING IMAGES, COURSE AI IMAGE, vision, STRUCTURED OUTPUT, then course modules.