26 courses. 98 complete written lessons. Worked examples, guided labs, reference responses and evidence-based project reviews.
Read offline in this single file. Open each reference response after making your attempt. Per-course and per-lesson Markdown files in the pack include all answers in full for editing or printing.
Turn a collection of screens into a coherent visual language. Build a small, useful design system you can actually grow.
For: Designers creating their first reusable interface kit. Before you begin: An interest in interface design. No previous design-system experience needed. Your outcome: A reusable interface kit with foundations, components, and clear usage rules.
10 min reading · 90 min labs · 120 min project. Planning estimates.
Course map
Decisions and hierarchy — Name recurring decisions and build a readable hierarchy.
Resilient components — Specify and test a card across content and interaction states.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Start with decisions, not components
A design system is a collection of shared decisions. Components are how those decisions become visible.
Find the repetition
Take three screens from the same product. List the repeated decisions: text sizes, spacing, surfaces, and actions. Start with the rules that recur; a huge component library is not the goal.
Name the intent
A name like color-action communicates a role. A name like green-500 communicates a value. Keep both layers: primitive values define the palette, and semantic tokens describe how the product uses it.
Try it
Choose a familiar app and write down five recurring decisions. Give each a semantic name. If two elements play the same role, they should usually use the same token.
Imagine three screens: Discover, Saved and Book details. Discover uses a pale card, Saved a slightly different pale card, and Book details a third shade. Record the role, current value and context before deciding that every difference is accidental. A selected card may need a distinct role; an unexplained difference between identical cards probably does not.
02
Build two layers
Create primitives such as moss-900 and paper-100, then map roles such as text-primary and surface-card onto them. The role answers why a value is used. The primitive answers what it currently is. A dark theme can remap surface-card without changing the name or meaning of the card component.
03
Trace a change
Suppose the primary action changes from lime to cream. Update the action role and inspect all its consumers: buttons, selected filters and any accidental decorative use. A decorative chart should not inherit an action color merely because the shades once matched. This dependency check reveals naming mistakes that a palette sheet cannot.
03 / MAKE SOMETHING
Your guided lab
Use the fictional reading-room screens to create a decision inventory. You may draw them as simple boxes; the exercise is about rules, not polished screens.
List eight repeated decisions across the three screens, including color, type and spacing.
Group decisions by purpose, then define five semantic tokens with concrete values.
Change one primitive and record every intended and unintended effect.
What to produce
A five-token table with role, value, consumers and one documented exception.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful minimum includes surface-page, surface-card, text-primary, text-secondary and action-primary. Card backgrounds share a role across Discover and Saved. A selected card can use a separate surface-selected role if selection carries meaning. Spacing belongs in its own scale; do not name a spacing value after a particular page. The exception note should explain the user need that justifies a different role, rather than describing a visual preference alone.
If something is not working
Too many tokens
If every component has its own color, inspect whether the roles are genuinely different before adding more names.
One token does everything
If a chart, button and error all share accent, separate the meanings before changing the color.
Take it one step further
A warning and a primary button currently use the same orange. Should they share one semantic token?
Reveal the reasoning
They can share a primitive value today, but their roles should remain separate. A future warning treatment should not silently restyle the primary action. Token structure protects the decision, not merely the current hex value.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 2 / 3 min read / 30 MIN PRACTICE
Build a visual hierarchy
Hierarchy helps a reader decide where to look, what to understand, and what to do.
Choose three levels
Start with a title, body text, and supporting label. Make the difference between levels obvious without relying on color alone. Keep paragraphs at a comfortable line length.
Use a spacing rhythm
Try a small scale of 4, 8, 16, 24, and 40 pixels. Related elements sit closer together. Unrelated groups need more separation. A spacing scale supports judgement rather than replacing it.
Try it
Arrange a title, description, price, and button inside a card. Blur your eyes: the title and primary action should still be easy to find. Test the design at a narrow width.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Start with the content order
Use this card content: The Quiet City; a collection of short walks; 12 essays; Save to reading list. Rank it before styling: title identifies the object, description explains it, count supports the choice, and the button performs the task. If all four are bold and similarly sized, the page asks the reader to invent that order.
02
Make relationships spatial
Try 8px between title and description, 16px before the supporting count and 24px before the action. These are hypotheses, not sacred numbers. Compare the result with equal 16px gaps everywhere. The first arrangement makes groups visible even in grayscale; the second creates four unrelated blocks.
03
Test with difficult content
Replace the title with The Quiet City and Its Unexpectedly Long Afternoon Walks. Let it wrap naturally. Review whether the button still feels attached to the card and whether neighboring cards remain easy to scan. A fixed title height may preserve a screenshot while cutting off the very information that identifies the book.
03 / MAKE SOMETHING
Your guided lab
Compose the same reading card in a 280px column and a 520px column. Keep the content and hierarchy consistent.
Choose three type roles and specify size, weight and line height for each.
Compare equal spacing with grouped spacing, using the same content.
Add the long title and inspect both widths at enlarged text size.
What to produce
Two card layouts and an annotated explanation of reading order and grouping.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A defensible solution uses a distinct title, a comfortable body paragraph and a quieter count. The action has a clear label and sufficient space around it. The narrow version gains height rather than shrinking every word. A larger version can increase the title modestly without turning the supporting count into a competing headline. Judge success by whether a new reader can identify the book and the action quickly, not by whether every card has the same silhouette.
If something is not working
Hierarchy disappears in grayscale
Strengthen size, weight or grouping instead of relying only on an accent color.
The long title pushes content out
Remove fixed text heights and inspect the parent layout constraints.
Take it one step further
A price must become more prominent, but the primary action should remain clear. What would you change first?
Reveal the reasoning
Increase the price’s emphasis within the supporting group and reduce unnecessary emphasis elsewhere. Recheck the title–price–action sequence. Making every important item bigger usually increases competition rather than clarifying priority.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Make components resilient
A useful component survives long text, missing images, keyboard input, and a small screen.
Design the states
Write down default, hover, focus, disabled, loading, and error behavior before polishing the default appearance. Only include states that the component needs.
Define the contract
Decide which parts are content and which are structure. Let a card accept a title and description while preserving its spacing and hierarchy. Avoid arbitrary variations without a real use case.
Your project
Build the reading-app kit described in the project brief. Test a long title, a missing image, and keyboard navigation. Document what changed after those tests.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Separate content from options
A reading card needs an ID, title, description and save state. An optional image is content. A dozen flags named compact, special and homepage may instead describe undocumented design exceptions. Write the minimum interface before building variants, and ask what user need each optional property serves.
02
Map the state transitions
Saving moves the card from unsaved to saved; a failed remote save would require an error and recovery path. A local demonstration can state that it saves on this device. Loading belongs only where work actually takes time. Disabled should explain why an action is unavailable rather than appearing as an unexplained faded button.
03
Review the contract under stress
A card without an image still needs its title and action. A long description should not cover the button. A keyboard user should reach the actual action once, with a visible focus ring. Avoid making a whole clickable card contain another nested button; separate the title link from the save action.
03 / MAKE SOMETHING
Your guided lab
Finish the reading-app component from the earlier lessons and produce a state sheet.
Document required fields, optional fields and the action emitted by the card.
Create unsaved, saved, missing-image and long-content examples.
Test keyboard navigation and note what happens after repeated save actions.
What to produce
A reusable card, four state examples and a concise usage contract.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The contract should preserve a stable item ID, allow content to grow and keep navigation distinct from saving. A saved state can use a changed label and pressed state so meaning does not depend on a filled icon. Repeated activation should toggle predictably or be idempotent, depending on the action label. Document that choice. The final kit includes tokens from lesson one and hierarchy from lesson two, so the component demonstrates the system rather than becoming an unrelated final exercise.
If something is not working
Variants multiply without a reason
Replace presentation flags with a documented composition or a separate component when the responsibility is different.
Focus disappears after saving
Keep the button node stable and change its state instead of replacing the whole card.
Take it one step further
A missing image collapses the card’s upper area. Is that always a defect?
Reveal the reasoning
No. It is a defect if the reading order, alignment contract or available action breaks. A deliberately image-free composition can be better than a decorative placeholder. State the intended behavior and test it with actual neighboring content.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Capstone project
Create a compact design system for a reading app: a color palette, a type scale, spacing tokens, and a card component with default, hover, and focus states. Document one example of when each component should be used.
Inventory three reading-app screens and define semantic tokens.
Build the type, spacing and card specimens.
Review difficult content and keyboard states, then document usage.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Define semantic color tokensEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Create a three-level type hierarchyEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Build a card with visible focusEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Document component usageEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Translate a considered design into an interface that responds beautifully to real people and real data.
For: Frontend learners ready to coordinate a small React interface. Before you begin: Comfort with HTML, CSS, and JavaScript functions and arrays. Your outcome: An accessible reading-list interface with filters, saved items, and clear empty states.
10 min reading · 90 min labs · 150 min project. Planning estimates.
Course map
State and responsibility — Model source data, derived views and component responsibilities.
The complete interaction — Build and verify empty, saved, pending and error states.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Model the interface as state
An interface is a view of the data a person is working with. Start with that data before writing components.
Keep the source small
Store the source items, selected filter, and search query. Calculate the filtered items from those values. Keeping a second copy of the filtered list creates opportunities for the copies to disagree.
Name the transitions
A save button changes a saved-ID collection. A search field changes a query. Writing these transitions in plain language makes event handlers easier to understand.
Try it
Sketch the data for a reading list. Separate what the user changes from what you can calculate. Count and filtered results are usually calculated values.
Use three books: A, Coastal Walks, topic Travel; B, City Gardens, topic Nature; C, Coast at Night, topic Fiction. Keep their IDs stable. With query coast and topic All, A and C should appear. With topic Travel, only A should appear. Write these expectations before rendering the list.
02
Assign ownership
The page owns query, topic and saved IDs. Visible books and visible count are calculated from those values. This avoids synchronizing a second filtered array after every change. If the source books come from elsewhere, treat them as input to this calculation rather than copying them merely to mirror them.
03
Trace an action
Saving A should update saved IDs without altering the source book object or the current filter. Use the current saved collection when calculating the next collection. Then derive each card’s saved boolean from its ID. A count of saved items comes from the same collection, so it cannot quietly disagree with the cards.
03 / MAKE SOMETHING
Your guided lab
Implement the three-book fixture in a React project and draw a small state ownership diagram.
Write a pure filter function for query and topic, preserving the source array.
Store only query, topic and saved IDs as the page’s interactive state.
Run the expected combinations and toggle A twice while a filter is active.
What to produce
A working filtered list and a table separating stored values from derived values.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Store the user’s choices, derive the result. Normalize query case and surrounding whitespace deliberately. A query of coast matches A and C; adding Travel narrows to A; clearing only the query preserves the Travel selection. Toggling A twice returns the saved collection to its earlier state without changing the books. If you decide search should include descriptions, change the filter contract and its examples together. Do not let an incidental string concatenation define the product’s search behavior.
If something is not working
Results lag one action behind
Inspect whether you stored a derived list or calculated from an outdated event value.
Saving changes another card
Use stable IDs instead of array positions, especially after filtering.
Take it one step further
Should visibleCount be stored separately so the heading can read it?
Reveal the reasoning
No separate storage is needed when visibleCount is simply the length of the current filtered collection. Derive it during rendering and pass it to the heading. Store it only if it represents a genuinely different piece of information, such as a server-reported total.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 2 / 3 min read / 30 MIN PRACTICE
Design component boundaries
Good boundaries make change local. Split components around responsibilities rather than arbitrary visual boxes.
Follow the responsibility
A FilterBar collects choices. A BookCard presents one item and exposes actions. A ReadingList coordinates the data. Each name tells you why that component exists.
Keep state near its owner
If multiple siblings need the same selection, let their nearest shared parent own it. Pass data down and events up. Move to a broader state solution only when that model stops being clear.
Try it
Write the props for a BookCard without implementing it. If the props describe the whole application, the boundary is probably doing too much.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Sketch the responsibilities
ReadingPage coordinates choices. FilterBar presents query and topic controls. BookList arranges results. BookCard presents one book and emits a save request. A component boundary is useful when its name explains a responsibility and its inputs explain what it needs to fulfill that responsibility.
02
Design the card interface
A card can receive book, saved and onToggleSaved. It should not receive every filter setter or know how browser storage works. When activated, it reports the book ID. The parent decides the next saved collection. This keeps the same card usable in both search results and the saved-items view.
03
Follow a shared change
The toolbar’s saved count and each card depend on the same saved collection. Their nearest coordinating parent owns that value. Duplicating it in both components creates a reconciliation problem. Conversely, a purely local expanded-description control can stay inside the card when nothing else needs to coordinate it.
03 / MAKE SOMETHING
Your guided lab
Build a component map and implement one reusable BookCard in two views.
Write the props and event signatures before the JSX.
Render the card once in results and once in a saved-only view using the same ID.
Change saving from either location and confirm that the shared state updates both.
What to produce
A responsibility diagram, a small prop contract and two synchronized views.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful contract is BookCard({book, saved, onToggleSaved}). The parent derives saved from savedIds.includes(book.id) and passes a callback that accepts the ID. FilterBar similarly receives current values and change callbacks. This is enough for the small exercise; an application-wide store would add a dependency without solving an actual coordination problem. The boundary succeeds when a change to storage or filtering does not require rewriting the card’s presentation.
If something is not working
The card imports application storage
Move persistence to the owner and pass the relevant state through its interface.
Every component receives every prop
Identify the missing coordinating boundary instead of forwarding the whole application object.
Take it one step further
A description can expand independently in each card. Must its state move to ReadingPage?
Reveal the reasoning
Only if the product needs coordination, such as allowing exactly one expanded card. Independent local disclosure can remain local. State placement follows the required relationship between components, not a rule that every value belongs at the top.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Ship the states between screens
People experience the transitions and edge cases, not only the happy path.
Treat empty as useful
An empty search should name the active query and offer a way to clear it. An empty saved list can explain how saving works. Neither is an error.
Make actions perceivable
Use real buttons, accessible names, visible focus, and status messages for changes that happen without navigation. Preserve keyboard focus when content updates.
Your project
Build the reading-list app. Try a query with no matches, save an item twice, reload persisted data, and navigate entirely with Tab and Enter. Record what those checks reveal.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Distinguish the empty cases
No matching results means the current filters found nothing; an empty saved list means no items have been saved. A failed request means the application could not establish the result. Give each state a different explanation and a next action. “Nothing here” is too vague to guide recovery.
02
Preserve the interaction
After saving, keep focus on the same button and update its label or pressed state. A polite status message can announce a concise result without moving focus into it. If filtering removes the focused card, choose a predictable place such as the filter control or result heading, based on the action that caused the change.
03
Make persistence testable
Persist only the values your product promises to retain, such as saved IDs. Parse stored data defensively and ignore unknown IDs. A fresh browser fixture should begin empty, save B, reload and still show B saved. Keep this test’s storage separate from the person’s real learning or reading data.
03 / MAKE SOMETHING
Your guided lab
Finish the reading-list project with an explicit state inventory and a repeatable browser journey.
Add no-match, no-saved-items and simulated-load-failure presentations.
Save B by keyboard, filter it out, clear filters and verify its saved state.
Reload an isolated test fixture and check both the visible card and saved count.
What to produce
A complete reading-list flow with a recorded keyboard and persistence review.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A strong result keeps status, content and controls aligned. Searching for an absent title offers Clear search while preserving unrelated choices. A failed load offers Retry without claiming zero books exist. Saving B changes one shared state source, and reload restores that same ID. Record the conditions and actual result for each check. A pass means the promised observation occurred; a handler being called or a page looking familiar is weaker evidence.
If something is not working
An error appears as an empty list
Model request status separately from the successfully returned collection.
Reload breaks the page
Validate parsed storage and fall back to a usable initial state when it is malformed.
Take it one step further
A retry succeeds with an empty array. Should the failure message stay visible?
Reveal the reasoning
No. The new request established an empty success, so the interface should replace the error with the appropriate empty-result guidance. Preserve the user’s query, but update the outcome to match the latest completed request.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Capstone project
Build a reading-list app with a title search, topic filters, and a save action. Keep the source list separate from its filtered view. Include loading, empty, and error states, then test every action with a keyboard.
Define the book fixture, saved IDs and derived filters.
Build the shared state owner and focused child components.
Verify keyboard actions, recovery and isolated persistence.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Model source and derived stateEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Add search and topic filtersEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use accessible buttons and labelsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Handle empty and error statesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Create a repeatable workflow for working with coding assistants—without handing over your judgement.
For: Designers and developers using a coding assistant for a concrete project. Before you begin: A basic understanding of HTML and CSS, plus access to a coding assistant of your choice. Your outcome: A reusable project brief, critique checklist, and iteration log for an original landing page.
10 min reading · 90 min labs · 120 min project. Planning estimates.
Course map
Brief and critique — Write measurable requirements and revise through controlled comparisons.
Verification and handoff — Exercise the promised flow and report observed results honestly.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Write a brief that makes decisions
A useful prompt starts with a useful brief. Describe the person, the task, and what a successful result lets them do.
Make the goal concrete
“A beautiful website” leaves the important decisions open. “A booking page where a first-time visitor can compare three workshops and reserve a time” creates a clear task.
Supply the constraints
State the content, required interactions, layout boundaries, and accessibility expectations. Explain what you admire about a reference instead of asking for an unexamined copy.
Try it
Write a brief in four parts: audience, primary action, content, and constraints. Remove adjectives that do not change an implementation decision.
Audience: first-time workshop visitors
Primary action: compare topics and choose a session
Content: title, outcome, prerequisites, time, price
Constraints: keyboard access, mobile layout, no fabricated proof
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Replace taste words with decisions
Consider “Make a premium workshop website.” It supplies a mood but leaves audience, content and behavior open. Rewrite it around a first-time visitor comparing three workshops by outcome, date, prerequisites and price. The action is choosing a session, so those facts belong near the decision rather than buried beneath an abstract hero.
02
Name evidence and constraints
Provide the actual workshop facts and label any fictional demonstration data. State that reviews, instructor credentials and availability must not be invented. Specify keyboard access, narrow-screen behavior and the expected result of a selection. A reference can suggest generous spacing or editorial type without authorizing copied copy or imagery.
03
Define a reviewable increment
Ask for one comparison section with a working session selector before asking for the whole site. Define acceptance observations: three workshops are visible, selecting a session updates the summary, and an unavailable choice explains why. This gives the next critique something concrete to examine.
03 / MAKE SOMETHING
Your guided lab
Write a brief for a fictional paper-making workshop catalogue with three explicitly labeled sample sessions.
Specify the audience, decision, supplied facts and primary action.
Translate three aesthetic preferences into layout or interaction decisions.
Write five observations that would establish whether the first section works.
What to produce
A reusable brief containing inputs, constraints, a first increment and acceptance observations.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The brief should allow an implementer to proceed without guessing essential facts. For example: “Use an editorial heading and restrained supporting labels; keep date and prerequisites adjacent to each workshop; selecting a sample session updates a local summary and never claims a real reservation.” The acceptance list checks keyboard activation and narrow layout as well as the visible content. Save the brief separately from tool-specific instructions so another assistant or developer can work from the same product decisions.
If something is not working
The result invents social proof
Supply approved evidence and explicitly identify demonstration content rather than leaving the proof section open.
The assistant builds too much at once
Reduce the next increment to a complete, testable slice of the visitor’s task.
Take it one step further
A reference has animated testimonials but your project has no testimonials. What should the brief request?
Reveal the reasoning
Describe the useful visual principle, such as paced disclosure, and apply it to verified workshop information. Omit unsupported testimonials. A reference informs design decisions; it does not supply evidence about your own product.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 2 / 3 min read / 30 MIN PRACTICE
Critique one dimension at a time
Specific criticism is actionable. A general feeling is a starting point, not a useful change request.
Separate the concerns
First check whether the page does the right job. Then examine hierarchy, spacing, typography, and motion. Make the smallest change that tests your hypothesis.
Explain the evidence
Instead of “make it premium,” say “the price and primary button compete with six equally bold labels; reduce the label emphasis and keep the action visually distinct.”
Try it
Review a generated section and write three observations. Connect each observation to a user task and an explicit proposed change.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Describe the visible problem
The first section contains a headline, six bold labels, three colored prices and three animated buttons. “It feels busy” is a useful reaction, but not yet a change request. Identify the consequence: the visitor cannot quickly distinguish the workshop outcome from supporting information.
02
Change one relationship
Keep the content and layout fixed while reducing secondary label emphasis. Move date and duration into one quiet metadata line. Preserve the primary action’s contrast. This tests a hierarchy hypothesis without simultaneously changing typography, palette and page structure, which would make the cause of improvement unclear.
03
Compare against the task
Ask a fresh reader to identify a suitable workshop and explain the next action in each version. Record uncertainty, not just preference. If the calmer version hides an important prerequisite, it solved one problem while creating another. Restore the necessary emphasis rather than treating minimalism as the goal.
03 / MAKE SOMETHING
Your guided lab
Critique a generated comparison section through three controlled revisions.
Write an observation, a task consequence and a proposed change for each revision.
Keep unrelated variables fixed and save before/after states.
Run the same short decision task after each change and record what improved or worsened.
What to produce
A three-entry critique log with evidence and a retained or rejected decision.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful entry reads: “The prerequisite is missed because it shares a faint footer with legal copy. Move it beneath the outcome and label it Before you join. In the repeated task, the reader notices the required tools before selecting.” An unsuccessful revision still teaches something if the outcome is recorded honestly. Keep a change only when it improves the intended task or fulfills another explicit requirement. Novelty alone is not evidence of better design.
If something is not working
Every revision changes the entire page
Freeze unaffected dimensions so the hypothesis can be evaluated.
The log records only opinions
Add the task, observed behavior and a specific uncertainty that remains.
Take it one step further
Two reviewers prefer opposite color palettes, but both complete the task equally well. How should you decide?
Reveal the reasoning
Treat that as a brand-direction decision, not a proven usability improvement. Choose against the brief’s visual principles, then verify contrast and state clarity. Separate a preference judgment from an observed task failure.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Verify before you trust
An assistant can produce a plausible-looking result that does not behave correctly. Verification belongs in the workflow.
Test the critical path
Exercise the exact flow the page promises. Test inputs, empty results, small screens, keyboard navigation, and reloads. Check claims and assets against their sources.
Keep an iteration record
Record the intention, the change, and the observed result. This makes future prompts more precise and helps you distinguish real improvement from novelty.
Your project
Build your landing page and keep a three-entry iteration log. For each revision, include one concrete test and its actual outcome. Do not describe a planned check as a passed check.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Inventory the promises
List every action the page appears to offer: open details, select a session, save a choice and confirm a local demo. A button with a polished hover state still needs a truthful result. Distinguish local simulation from a live reservation, and verify that the visible wording preserves that distinction.
02
Test recovery, not only success
Choose a nonexistent search, clear it, change a selection twice and reload after saving. Tab through the complete flow. Try a long workshop title and a narrow viewport. Each check targets a likely mismatch between a convincing screenshot and a usable interface.
03
Keep the evidence attached
For each requirement, record the test setup, action, expected observation and actual observation. A screenshot proves a visible state at one moment; it does not prove persistence or server delivery. Use the kind of evidence that matches the claim you intend to make.
03 / MAKE SOMETHING
Your guided lab
Review the completed workshop concept and produce a short release note.
Trace the main visitor journey from discovery to the clearly labeled local confirmation.
Exercise keyboard, empty results, repeated actions, reload and a narrow screen.
Classify findings as passed, failed or not tested, with a concrete next step for failures.
What to produce
A working concept, three iteration records and a release note that matches the evidence.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The release note can say that local selection and persistence were tested in the named browser, while payment and real availability do not exist. It should name any remaining defect without presenting a planned fix as finished. If a button has no meaningful action, implement its promised behavior or remove the promise. The final artifact includes the brief and review log so the creative decisions remain traceable after the conversation with the assistant ends.
If something is not working
A screenshot is used to claim enrollment works
Exercise the complete interaction and inspect its visible result and persistence.
A generated claim has no source
Remove or qualify the claim until suitable evidence is supplied.
Take it one step further
The assistant reports “all tests pass,” but provides no command result or browser evidence. What can you conclude?
Reveal the reasoning
Only that it made the statement. Run the relevant checks or inspect trustworthy recorded results before repeating the claim. Match your final wording to what was actually verified, including any limits of the test environment.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Capstone project
Write a specific brief for a small product site. Use your preferred coding assistant to implement one section at a time. Capture three rounds of critique, verify the important interactions, and explain which decisions remained yours.
Write a workshop-page brief with content and behavioral requirements.
Capture three revisions with a hypothesis and observed result.
Verify the critical path and deliver the page with an evidence log.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Write an outcome-focused briefEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Define constraints and referencesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Record three deliberate iterationsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Verify actual behaviorEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Give interfaces rhythm and clarity with purposeful animation, gentle transitions, and accessible motion.
For: Interface makers adding purposeful CSS motion to existing controls. Before you begin: Basic HTML and CSS, including selectors and transforms. Your outcome: A small interaction library with responsive transitions and a reduced-motion alternative.
10 min reading · 90 min labs · 120 min project. Planning estimates.
Course map
Purpose and rhythm — Connect a state change to a deliberate duration and easing choice.
Optional movement — Preserve meaning under interruption and reduced motion.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Give every movement a reason
Motion can show where an element came from, where it went, or what just changed.
Start with the change
Choose one event: a panel opens, an item is saved, or a selection changes. Decide what information motion adds. If it adds no useful information, leave the transition out.
Keep it brief
Try a short duration around 160–240ms for small interface transitions, then adjust to the distance and complexity. This is a starting point, not a universal rule.
Try it
Pick a button and a panel. Describe their state change without using animation terminology. That sentence is the purpose your animation should serve.
A disclosure reveals more detail about the selected workshop. That is the event. A downward expansion may help the reader connect the new content to its trigger. Rotating a decorative star elsewhere does not explain that relationship. Name the task before choosing the effect.
02
Separate state from decoration
The expanded state controls whether the details are available and whether the trigger reports expanded. Animation visualizes that change; it should not delay the control’s meaning. Keep the content readable when transitions are removed and preserve a working keyboard trigger.
03
Choose the smallest useful movement
Compare an immediate reveal, a short opacity change and a large sliding entrance. Review reading continuity and the distance the eye must travel. A larger effect can be appropriate for a major spatial change, but a small disclosure usually needs a quieter explanation. Record the reason for the chosen treatment.
03 / MAKE SOMETHING
Your guided lab
Design a disclosure, a save confirmation and a navigation selection with a one-sentence purpose for each.
Write the before state, user action and after state for all three interactions.
Choose one visual property that clarifies each transition.
Remove animation and verify that the resulting state remains understandable.
What to produce
Three state diagrams and one implemented interaction with a stated motion purpose.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
For saving, a changed button label and a brief status message establish success; a small scale or opacity change may reinforce it. For navigation, an underline can connect the old and new selection. For a disclosure, the content remains associated with its trigger. None of these requires an endless loop. The evidence of quality is that the reader understands what changed and can continue immediately, even when movement is absent.
If something is not working
An effect looks good but explains nothing
Remove it temporarily and compare task clarity. Retain it only if its visual role is intentional.
Interaction waits for the animation
Update semantic state immediately and keep the visual transition interruptible.
Take it one step further
A save action succeeds instantly. Should you add a fake loading animation to make it feel substantial?
Reveal the reasoning
No. Confirm the actual completed action. A deliberately brief visual acknowledgment can help recognition, but an invented pending state makes the interface’s explanation less truthful.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 2 / 3 min read / 30 MIN PRACTICE
Shape the rhythm with easing
Two transitions with the same duration can feel very different because their speed changes differently over time.
Consider the destination
An element entering view often benefits from slowing as it reaches its resting point. A linear transition moves at a constant rate and can feel mechanical in the wrong context.
Avoid accidental choreography
Many independent animations competing at once create noise. Make one action dominant and let supporting elements respond quietly. Never delay essential interaction for a flourish.
Try it
Apply linear, ease-out, and ease-in-out to the same small transform. Compare them at the same duration and explain which best supports the state change.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Keep distance and duration constant
Move the same panel 40px over the same duration with linear, ease-out and ease-in-out. Changing distance while comparing curves confounds the experiment. Watch the beginning, the middle and the arrival separately. Describe where speed is concentrated rather than calling one option “smooth.”
02
Match the arrival
A panel entering a reading position often benefits from a clear arrival that slows near its destination. A continuously rotating indicator has different needs. The curve is not a brand signature to apply blindly; it is part of how the movement explains a particular state transition.
03
Review simultaneous movement
If a panel, image, heading and button all animate with different delays, the eye may follow the wrong element. Establish the dominant change first, then add supporting motion only if it clarifies sequence. Essential controls should be available while decorative elements finish.
03 / MAKE SOMETHING
Your guided lab
Build a comparison strip with three identical transitions and select one for the workshop disclosure.
Hold distance, duration, start position and end position constant.
Record a sentence about each curve’s departure and arrival.
Add a rapid reverse action and inspect whether the control responds without replaying an obsolete sequence.
What to produce
A controlled easing comparison and a short decision note for the selected transition.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A reasonable disclosure may use a brief ease-out treatment that makes the newly available content settle clearly. The answer is not a universal curve value. It is a justified relationship between the event, travel distance, reading task and response. If the reverse action produces a jump, inspect how the transition starts from its current rendered state. Do not solve interruption by disabling the control until every earlier animation finishes.
If something is not working
One curve seems better only because it moves less
Repeat the comparison with identical geometry and timing.
Supporting elements steal attention
Remove staggered delays and reintroduce only those that establish a useful sequence.
Take it one step further
The same curve feels slow on a 200px movement but fast on a 10px movement. What changed?
Reveal the reasoning
The distance changed the apparent speed and amount of visual work. Easing, duration and distance act together. Reassess the transition as a whole instead of assuming the curve alone defines its character.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Make motion optional
The interface must remain understandable when animation is reduced or removed.
Respect the preference
Use prefers-reduced-motion to remove nonessential movement. Keep the resulting state visible through text, color, or structure. Reduced motion should not mean reduced functionality.
Test interruption
Click rapidly and change direction halfway through a transition. The interaction should remain responsive and settle into the correct state.
Your project
Build the three interactions from the brief. Test both motion preferences, keyboard use, and rapid input. Explain how the final state communicates the change without animation.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Make the final state independent
A common failure hides content initially and relies on an entrance animation to reveal it. If reduced-motion CSS merely removes the animation, the content stays invisible. Define the readable final state first, then opt into movement. A preference should change presentation, not remove information.
02
Test a mid-flight reversal
Open the disclosure, close it before it settles, then open it again. The latest action should determine the intended state. Check the expanded attribute, visible content and keyboard focus together. A beautiful animation ending in the wrong state is a functional defect.
03
Review the full preference path
Test both initial reduced-motion preference and a preference change while the page is open if the implementation supports live changes. Stop continuous decorative loops when they are unnecessary. For each interaction, identify the non-motion cue that communicates its state.
03 / MAKE SOMETHING
Your guided lab
Finish the three-interaction library with a motion-off version and an interruption record.
Add a reduced-motion rule that preserves readable final styles and clear state labels.
Run rapid repeated actions on each interaction with pointer and keyboard.
Document the state after each sequence and whether any animation work continues unnecessarily.
What to produce
Three working interactions, their static alternatives and a repeatable review checklist.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The disclosure remains a usable disclosure, the save control clearly identifies its saved state, and navigation still identifies the current destination. Reduced motion may remove translation while preserving immediate changes in text or structure. Completion should not depend on an animationend event that never fires when movement is disabled. Keep the interface state authoritative and use animation callbacks only for cleanup that has a safe alternative path.
If something is not working
Content disappears with reduced motion
Move visibility into the base state and apply hidden starting styles only when the animation path is active.
Rapid clicks replay old intentions
Retarget the current interaction rather than queueing every past action.
Take it one step further
A decorative animation pauses but keeps requesting frames forever. Is the reduced-motion implementation finished?
Reveal the reasoning
The visual result may be still, but the lifecycle still wastes work. Stop unnecessary scheduling and preserve a deliberate static state. Reduced motion should be considered in the rendering lifecycle as well as the stylesheet.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Capstone project
Create three interactions: an expanding disclosure, a save confirmation, and a navigation underline. Each should help explain a change. Add a reduced-motion version and document why you chose each duration.
Specify the disclosure, save and navigation state changes.
Implement and compare their timing using the same inputs.
Review rapid activation, keyboard use and reduced motion.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Give every animation a purposeEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use transform and opacity where appropriateEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Support reduced motionEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Test rapid repeated actionsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Find the right story, build a clear hierarchy, and turn a blank page into an intentional first impression.
For: Designers planning an original workshop landing page. Before you begin: Curiosity and a product or service idea. Sketch on paper or use a design tool. Your outcome: A responsive landing-page concept with a clear message, honest proof, and a primary action.
9 min reading · 90 min labs · 120 min project. Planning estimates.
Course map
Message and sequence — Write a clear offer and organize the questions a visitor needs answered.
The small-screen story — Compose and review the same priorities on a narrow screen.
LESSON 1 / 3 min read / 30 MIN PRACTICE
Find the one thing to say
A first-time visitor should quickly understand what this is, who it is for, and why the next step is useful.
Begin with the reader
Write down the situation that brought someone to the page. Use the words they would use to describe the problem. The headline should connect that situation to a concrete outcome.
Choose a primary action
A page can offer multiple routes, but the main action should be visually clear. Name what happens next. “Explore workshops” is more informative than “Get started” in a workshop catalog.
Try it
Write three headlines for the same offer. Remove vague praise and compare how clearly each explains the outcome. Choose the one a new visitor can understand without context.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Start with a situation
A visitor wants a weekend creative activity but is unsure whether beginners can join. “Unlock your creative potential” does not resolve that uncertainty. “Make your first handmade paper in a two-hour beginner workshop” names the activity, outcome and starting level. Use fictional details only when they are clearly marked as demonstration content.
02
Separate promise and support
The headline supplies the main idea. A short supporting sentence can explain that materials are included and show where dates are found. Do not force every detail into the headline. Keep important prerequisites close enough that a reader can make an informed choice before following the primary action.
03
Name the destination
If the button opens a session catalogue, label it Explore sessions. If it opens a local demonstration form, say so in nearby context. “Reserve my place” would imply a stronger result than a page that merely lists options. The label should make the next screen unsurprising.
03 / MAKE SOMETHING
Your guided lab
Write the opening section for the paper-making workshop using only the facts you have supplied.
List the visitor’s situation, desired outcome and main uncertainty.
Write three headline/supporting-copy pairs with different emphasis.
Choose an action label and describe the exact destination or local result.
What to produce
One selected opening message, two rejected alternatives and the reasons for the choice.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A strong opening can be direct without being bland: “A first sheet, made by you” becomes clearer when paired with “A beginner paper-making workshop, with tools and materials included.” The supporting line supplies the context that the expressive headline omits. The action leads to the actual session choices. Evaluate the pair together. An unusually poetic title is acceptable when the adjacent explanation makes the offer understandable without prior brand knowledge.
If something is not working
The headline could describe any product
Add the specific activity, audience or outcome that distinguishes this offer.
The action overpromises
Rename it around the next real step rather than the eventual business goal.
Take it one step further
A visitor remembers the mood but cannot explain what is offered. What should you revise?
Reveal the reasoning
Strengthen the concrete explanation near the headline and action before adding more decoration. The first section must establish the offer; atmosphere can support that understanding but cannot replace it.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 2 / 3 min read / 30 MIN PRACTICE
Build a page with rhythm
A page is a sequence of answers. Each section should earn its place by resolving a real question.
Order the questions
Start with what the offer is, then what the visitor gets, what it requires, and how to take the next step. The order can change when the audience brings different doubts.
Vary the pace
Alternate concise statements with useful detail. Use spacing and scale to express relationships. Avoid repeating the same card grid simply because it is easy to build.
Try it
Write a one-sentence purpose for each section. Merge sections that answer the same question. Remove a section that adds no useful information.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Map the unanswered questions
After the opening, the visitor may ask what they will make, what experience is needed, what the session includes, when it happens and how to choose. Write those questions on separate cards. The page order should reflect the audience’s decision, not a standard template’s list of decorative sections.
02
Choose a format for each answer
A finished-object image with a caption can explain the outcome. A short comparison table can clarify session differences. A process sequence can reduce uncertainty about the workshop. Repeating the same three-card grid for every answer flattens the rhythm and may force unlike information into the same shape.
03
Remove unsupported proof
A testimonial section without real testimonials is not an empty space to fill with invented praise. Replace it with verifiable information, such as the actual materials or a clearly labeled sample process. Evidence should answer a question the visitor has, not merely imitate a familiar conversion pattern.
03 / MAKE SOMETHING
Your guided lab
Storyboard a five-section workshop page without choosing final colors or typefaces.
Write the visitor question and one-sentence answer for each section.
Assign an appropriate content format to each answer.
Remove one redundant section and explain where any essential information moved.
What to produce
A five-section wireframe with content purpose, evidence source and action placement.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
One coherent sequence is offer, outcome, how the session works, practical details and session choice. The order can change if the audience’s first concern is scheduling or cost. Give the final decision section enough context to act, but do not repeat every earlier paragraph. A repeated action is useful after meaningful information; repeating the same pitch without adding evidence creates length rather than persuasion.
If something is not working
The page feels long despite little information
Identify sections that repeat the same answer and merge their useful content.
Important facts hide in a decorative grid
Choose a table, list or plain paragraph that makes comparison easier.
Take it one step further
The audience already knows the workshop but mainly needs dates. Should the usual introductory story stay first?
Reveal the reasoning
Not necessarily. Lead with the decision the returning audience needs to make, while retaining a concise route to background information. Page structure should respond to the visitor’s context rather than a fixed formula.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Make the small screen deliberate
A mobile layout is a fresh composition with the same priorities, not a desktop page squeezed narrower.
Preserve the priority
Keep the headline, explanation, and action in a natural reading order. Reduce decorative complexity before reducing text to an uncomfortable size.
Check the constraints
Test long labels, touch targets, line lengths, and horizontal overflow. Make sure imagery does not hide information that the copy depends on.
Your project
Build both layouts for the creative workshop. Ask someone to describe the offer after a short look. Use their uncertainty to improve the page rather than merely changing its style.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Keep the meaning in source order
Place the headline, explanation, essential facts and action in a sensible reading sequence before using a desktop grid. A side-by-side composition may collapse into one column, so the document order should still tell the story. Do not depend on a floating image caption that becomes separated from its image.
02
Protect the reading task
At 320px, a long action label may wrap. Let the control gain height instead of reducing its text to a tiny size. Reduce decorative overlaps and oversized margins before compressing body text. Review the page with realistic content, including the longest session title and an unavailable date.
03
Test the decision
Ask a reader to identify the activity, beginner requirements and next step. Observe where they search or hesitate. This is a small comprehension check, not proof of conversion improvement. Record what the check establishes and what it does not.
03 / MAKE SOMETHING
Your guided lab
Create desktop and narrow-screen layouts for the same workshop page, then review one complete decision journey.
Use a natural document order and recompose each section at 320px and a wide desktop width.
Test long labels, missing optional imagery and enlarged text.
Ask a reader to explain the offer and choose a suitable sample session without prompting.
What to produce
Two responsive compositions and a short record of observed uncertainty and revisions.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The mobile result should feel intentionally composed: readable copy, an obvious action, practical facts near the decision and no sideways page scroll. It may use a different image crop or remove a decorative overlap while preserving the same information. If the reader misses the beginner requirement, revise its location or emphasis and repeat that specific check. Do not report a successful comprehension task as evidence that real bookings or payments work.
If something is not working
Desktop visual order becomes confusing on mobile
Repair the document sequence rather than relying on extensive CSS reordering.
A fixed banner covers the action
Review the usable viewport and allow the content to remain reachable with keyboard and touch.
Take it one step further
A decorative image is beautiful but forces the primary action far below the practical information on mobile. What is a reasonable response?
Reveal the reasoning
Reduce, reposition or omit the decoration in the narrow composition. Preserve the information hierarchy and the reader’s decision path. Responsive design can change visual emphasis without changing the offer.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Capstone project
Design a landing page for an independent creative workshop. Explain the audience and outcome, use only verifiable supporting details, and create a simple path to exploring sessions. Produce desktop and mobile layouts.
Define the audience, offer and truthful primary action.
Compose a five-question page using verified or explicitly fictional facts.
Review desktop/mobile comprehension and revise the unclear moment.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Name the audience and primary actionEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Write a specific headlineEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use honest supporting evidenceEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Adapt the hierarchy for mobileEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Explore the expressive side of CSS while keeping your layouts responsive, readable, and easy to change.
For: HTML and CSS learners building a flexible visual component. Before you begin: Basic HTML: headings, paragraphs, links, and classes. Your outcome: A responsive editorial card composition built with reusable CSS rules.
10 min reading · 90 min labs · 120 min project. Planning estimates.
Course map
Layout and visual roles — Build intrinsic layout and a small role-based theme.
Stress and handoff — Verify long content, narrow containers and keyboard focus.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Let the browser share the work
Responsive CSS works best when you describe constraints and let the browser distribute the available space.
Start with the container
Use a maximum reading width, flexible side padding, and content that can shrink. Fixed widths are useful for some details but fragile as a default layout strategy.
Use a flexible grid
A grid with auto-fit and minmax can change column count based on available space. Set a sensible minimum, and ensure it never exceeds the container width.
Try it
Create three cards in the playground. Change the minimum column width and resize the preview. Notice how the layout responds without a separate breakpoint for every screen.
Begin with a page wrapper that can shrink, has flexible side padding and stops growing at a useful maximum width. A child cannot repair a parent that insists on being wider than the viewport. Inspect the containing blocks before adding a media query to every overflowing element.
02
Let tracks negotiate space
The existing grid example uses a minimum card width while allowing the minimum itself to shrink to 100% of a smaller container. The browser creates as many tracks as fit, then shares the remaining space. Change the minimum from 240px to 300px and predict when the column count will change before resizing.
03
Test content as well as width
A long unbroken URL can force a grid item wider than expected. Allow the item to shrink and choose an appropriate wrapping rule. A picture with a large intrinsic width also needs a responsive constraint. The layout rule and the content rules work together; neither one alone guarantees resilience.
03 / MAKE SOMETHING
Your guided lab
Build three editorial cards in the HTML/CSS playground using the supplied intrinsic grid pattern.
Create a wrapper, grid and three cards with real headings and descriptions.
Compare two minimum track widths in narrow and wide containers.
Add a long URL and oversized image, then repair overflow without hiding important content.
What to produce
A responsive three-card composition with a documented minimum track width and stress example.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful base combines a constrained wrapper, an intrinsic grid, shrinkable children and images that fit their content area. At narrow widths the grid becomes one column naturally. The card’s text remains in normal flow, so long content makes the card taller rather than clipped. The chosen minimum should reflect the smallest readable card composition, not a familiar device width copied from another project.
If something is not working
The page still scrolls sideways
Inspect fixed widths, min-width constraints and unbroken content up the ancestor chain.
Cards become narrow slivers
Increase the minimum useful track width or reduce the number of competing parent columns.
Take it one step further
A page is 1200px wide but the grid lives in a 400px panel. Which width should determine how many cards fit?
Reveal the reasoning
The grid’s available container width. Intrinsic track sizing responds to the space it actually receives, so the same component can work in a sidebar or main area without pretending both are full-width pages.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 2 / 3 min read / 30 MIN PRACTICE
Build a small visual vocabulary
A few well-chosen variables make an expressive composition easier to understand and maintain.
Give repeated values names
Use custom properties for surface colors, spacing, and border radii. Prefer names that describe their role. A change to one value can then update the composition consistently.
Keep the hierarchy distinct
Let display text be expressive while body text stays comfortable. Use a deliberate range of sizes and weights. Decoration should support the reading order.
Try it
Create a second theme by changing only five variables. If you need to rewrite many selectors, look for values that should have been shared.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Identify the repeated decisions
In the editorial grid, repeated values include page surface, card surface, main ink, supporting ink, accent, spacing and corner treatment. Name their roles before assigning colors. Avoid a variable named homepage-green when the same decision is used in several contexts or may stop being green.
02
Change the system, not every selector
Create a second theme by changing the role values at a parent scope. Keep layout and component selectors unchanged. Review text contrast, focus visibility and image relationships in the new theme. A successful variable system makes the change easy to express, but it does not automatically make every new combination readable.
03
Keep expressive and functional type distinct
A display title can carry personality while body copy remains comfortable. Use a small number of roles and let each do a clear job. If a decorative type treatment makes a long title unreadable, change that treatment at the affected size rather than shrinking all text across the component.
03 / MAKE SOMETHING
Your guided lab
Define a compact CSS vocabulary for the three-card composition and produce two deliberate themes.
List the semantic color and spacing roles used by the grid.
Implement the second theme by overriding variables at a wrapper.
Test the longest title, focus ring and supporting text in both themes.
What to produce
A documented variable set and two themes that reuse the same component rules.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The theme boundary should express a visual language, not a second implementation of the cards. Surface and ink roles can change together; an accent may need a corresponding on-accent text role. Keep spacing separate from colors so a palette change does not unexpectedly alter layout. Record any exception, such as a photographic card that requires its own overlay treatment, and explain the content condition that triggers it.
If something is not working
The second theme requires many new selectors
Look for values that belong in semantic variables or for a genuinely different component responsibility.
Accent text becomes unreadable
Review the foreground/background pair rather than changing one color in isolation.
Take it one step further
Two elements share the same gray today, but one is disabled text and one is a border. Should they always share one role variable?
Reveal the reasoning
No. They can share a primitive value while keeping distinct role variables. Their requirements may change independently; the variable names should preserve that distinction.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Polish the edges
Craft becomes visible when the content or device stops matching your ideal example.
Stress the content
Try a very long heading, a short description, and an absent image. Use overflow-wrap where necessary and avoid hiding important content just to preserve a shape.
Test the interaction
Use real links and buttons. Give keyboard focus a visible outline and make hover effects optional. The card must communicate its purpose before anyone points at it.
Your project
Build the editorial grid from the brief. Test at 390px and 1280px, tab through every action, and make a second theme from your custom properties.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Replace ideal content
Test a one-word title, a five-line title, a missing image and a long action label. Look for clipped text, unexpected empty space and actions that move out of reach. These are not rare nuisances; they reveal whether the component’s sizing rules actually describe content or merely fit a single screenshot.
02
Review the interaction contract
Use a real link for navigation and a button for a local action. Make focus visible against both themes. Keep the hit area clear without nesting one interactive element inside another. Hover decoration should not be required to discover what the card does, because touch and keyboard users may never see it.
03
Keep a useful record
Create a small matrix of width, content case and input method. Record the actual observation and fix the rule responsible for a failure. Repeating a desktop screenshot after every change is less informative than rerunning the specific long-title or keyboard case that exposed the problem.
03 / MAKE SOMETHING
Your guided lab
Complete the editorial grid and review it as a reusable component rather than a single page image.
Run four content variants at narrow, intermediate and wide container sizes.
Navigate every action with Tab and activate it with the appropriate keyboard key.
Apply both themes and record one defect, its cause and the corrected result.
What to produce
The finished grid, a stress-test matrix and a brief explanation of its supported content limits.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The finished composition should retain readable headings, natural content height and reachable actions across the matrix. A missing image can produce a simpler text card if that behavior is intentional. A long label wraps within a control with adequate padding. Your record should distinguish a passed case from an untested browser or assistive technology. A reusable component has a stated contract and evidence from its important boundaries, not a claim that every possible input is supported.
If something is not working
The focus ring is cut off
Inspect overflow clipping and reserve room for the outline or use a suitable inset treatment.
Only the ideal title fits
Remove fixed text heights and reconsider the type scale or available measure.
Take it one step further
A card looks uneven beside a longer neighbor. Should you truncate the longer title immediately?
Reveal the reasoning
First decide whether equal height is an actual requirement. The parent grid may align cards while allowing complete text. Truncation is a content decision that can hide the information needed to choose; use it only with a clear reason and an accessible route to the full title.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Capstone project
Build an editorial card grid for three creative projects. Use CSS custom properties for color and spacing, let the grid respond to available width, and create clear keyboard focus styles. Add a long title to test the composition.
Build a card whose layout follows available content space.
Apply role-based variables across two intentional themes.
Run the difficult-content matrix and document the repaired component.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Use a responsive gridEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Define reusable custom propertiesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep headings readableEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Add visible keyboard focusEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Give an independent journal a distinctive voice without sacrificing the pleasure of reading.
For: Designers who can arrange a basic page and want more control over type. Before you begin: Basic layout experience. Use a design tool or the HTML and CSS playground. Your outcome: A responsive journal specimen with tested type roles, reading measures and a documented font pairing.
17 min reading · 120 min labs · 90 min project. Planning estimates.
Course map
Voice and hierarchy — Choose type by its job and prove the hierarchy with real text.
Reading and delivery — Tune measure, spacing and responsive behavior into a reusable specimen.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Choose a voice before a typeface
A journal about quiet places should not sound like a sports scoreboard. Begin with the reading situation.
Design the role
Write three attributes for the publication and translate each into a visible decision. “Reflective” might suggest generous leading and a steady text rhythm. “Precise” could mean a clear numeral set and disciplined labels. These are hypotheses, not rules about serif versus sans. Compare actual words; a font preview alphabet cannot show how your headline breaks.
Worked example
Interval needs a large opening line, a 300-word essay, and short place captions. Try a high-contrast display face only for the opening. Set the essay in a face whose small counters and punctuation remain clear at the intended size. Compare both pairings with “Between arrivals” and a caption containing 11:45, an em dash and parentheses. The quieter pairing may make the photograph more prominent.
Make a specimen
Create two versions using identical content, size and layout. Change only the pairing. Read a paragraph aloud while following the text and note where the eye loses its place. Annotate three specific differences: rhythm, character width and punctuation clarity. Record the font license before committing to distribution.
Common mistake
Choosing two unusual display faces can produce a striking title and an exhausting article. Reserve expressive treatment for one role, then check whether a neutral companion creates enough contrast without looking unrelated.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Write the editorial premise
Interval is a fictional journal about ordinary places observed carefully. Its voice is reflective and precise, not nostalgic by default. Translate those qualities into testable criteria: the headline should feel considered, the body should support uninterrupted reading, and captions should clearly identify factual context. A serif face is one possible response, not the definition of thoughtful writing.
02
Compare on identical content
Use the headline “An afternoon between stations,” a 120-word paragraph and a caption naming a place and date. Keep the column width and approximate perceived size comparable. A large x-height can make one face look bigger at the same nominal size, so compare the actual reading impression rather than treating the size field as a neutral control.
03
Choose a relationship
Test one family with different roles before adding another family. If a second face improves contrast between editorial voice and navigation, state that job. Two expressive faces may compete; a quiet supporting face can give the display face room to carry personality. Check the required punctuation, numerals and accented characters.
03 / MAKE SOMETHING
Your guided lab
Create three type studies for Interval using the same headline, paragraph and factual caption.
Write three criteria connecting the publication’s voice to reading behavior.
Compare a single-family system with two deliberate pairings.
Review punctuation, numerals and a long headline before choosing one direction.
What to produce
A comparison sheet with one selected direction and evidence for rejecting the others.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A defensible choice explains both character and use. For example, a restrained serif headline can establish an editorial tone while a neutral sans caption keeps dates and labels crisp. The body face earns its place by remaining comfortable over real paragraphs. The selected pair need not be unusual. The quality lies in the relationship, the optical adjustments and the evidence that it supports this publication’s content.
If something is not working
The choice depends on one beautiful word
Replace the specimen with the actual longest headline and a full paragraph.
The pairing feels arbitrary
Assign each family a distinct role or simplify to one family.
Take it one step further
A favorite display font lacks the accented characters used in the journal. What should the type decision include?
Reveal the reasoning
Character coverage is part of suitability. Choose a complete alternative or define and test a compatible fallback. Do not treat missing characters as a production detail that can be ignored until after the visual direction is approved.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
The title is distinctive, but the article feels tiring. What should you test first?
A second decorative face for captions
A more readable text face at the same measure
A narrower column while keeping the same small type
Reference answer
B. Hold the layout steady and isolate text-face readability before changing unrelated elements.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Make hierarchy visible without decoration
A reader should distinguish an article title, section heading and caption before reading every word.
Build a small scale
Start with roles rather than a long list of sizes: display, title, body, caption and label. Specify size, weight, line height and spacing for each. A mathematical scale is useful scaffolding, but an actual line break can justify moving a size. Keep related roles close enough to belong together and different enough to recognize.
Worked example
Use a 48px title, 24px section heading, 18px body and 13px caption on the desktop specimen. At 390px, try a 36px title while leaving body text comfortably readable. If title and section heading seem equally loud, first reduce heading weight or increase the space above it. Adding a border to every section would obscure the hierarchy you are trying to test.
Practice
Lay out a title, deck, two paragraphs, subheading and caption in black and white. Remove the photograph. Ask a reader which element begins the article and which introduces a new idea. Adjust one role at a time, then write your final values beside the specimen.
Check the edge
A short title can disguise weak hierarchy. Replace it with “A room between one arrival and the next” and let it wrap naturally. Avoid a fixed height that cuts off the third line.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Rank the information
An Interval article contains a section label, title, standfirst, author, date, body and captions. Rank them by the reader’s task. The title identifies the story; the standfirst establishes its angle; the body carries the argument; metadata supplies context. A section label should not compete with the title simply because uppercase letters look attractive.
02
Use more than size
Weight, line height, measure, spacing and placement all contribute to hierarchy. Try a title with generous space below the section label, a compact standfirst beneath it and quieter metadata grouped together. Then remove color. If the relationships collapse, strengthen structural cues rather than adding more decorative rules.
03
Stress the headline
A five-line title changes the balance of the opening. Let the content expand and review the spacing around it. Do not preserve the first screenshot by forcing the title into a fixed box. A title scale can respond to available width, but the smallest state still needs an intentional reading rhythm.
03 / MAKE SOMETHING
Your guided lab
Build an article opening at 360px and 900px with the same seven content roles.
Assign a role, size, line height and spacing relationship to each text element.
Make a grayscale version and identify the first three things the eye notices.
Replace the title with a much longer one and revise the surrounding rhythm.
What to produce
Two responsive article openings with annotated type roles and a long-title variant.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The title remains the strongest signal, the standfirst explains the story and metadata stays readable without shouting. Group the author and date because they answer related contextual questions. Use spacing to separate the opening from the body rather than inserting a decorative element without a purpose. The long-title version should preserve that hierarchy while changing its total height. Consistent relationships matter more than identical coordinates.
If something is not working
Every role uses a different font
Reduce the vocabulary and establish distinction through scale, weight and grouping.
Metadata disappears
Quiet is not the same as unreadable; review size and contrast at actual display scale.
Take it one step further
The title is larger than everything else but still feels weak. What else would you inspect?
Reveal the reasoning
Look at competing weight, contrast, placement and surrounding space. A dense cluster of bold labels can overwhelm a larger title. Hierarchy is a relationship among elements, not a ranking of font-size numbers alone.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A long headline gains a third line. Which adjustment preserves the content?
Clip the extra line
Allow the block to grow and review adjacent spacing
Shrink all text to 11px
Reference answer
B. The heading should determine its height; review the resulting composition instead of hiding words.
LESSON 3 / 5 min read / 30 MIN PRACTICE
Tune the line, not just the font size
Reading comfort emerges from the relationship between letter shape, line length and vertical rhythm.
Set constraints
Use a maximum text measure and responsive side padding. A range around 55–75 characters is a useful starting experiment for continuous prose, not a universal pass mark. Narrow measures may need different line height; wide text can make finding the next line harder. Evaluate with the actual language and font, including punctuation and long words.
Worked example
An 18px essay stretches across a 1000px content area. Limiting it to 65ch creates a calmer central column, while the image can retain the full width. At 390px, padding becomes the effective constraint. The ch unit follows the zero glyph, so 65ch does not guarantee exactly 65 characters on each line. Inspect the output rather than counting the declaration as evidence.
Practice
Render the same paragraph at 45ch, 65ch and 85ch. Compare how quickly you find the next line. Test 200% zoom, a narrow window and a long URL. Keep the variant that balances reading comfort with the publication’s rhythm; explain why the other two are weaker in this context.
Common mistake
Tightening tracking to force a paragraph into a decorative box changes every word to solve one layout problem. Change the container or content structure before damaging the text texture.
Use several paragraphs with short and long sentences, punctuation and an emphasized phrase. A type specimen made of repeated filler words hides the rhythm of real prose. Read aloud or follow several lines with your eye and note where the return to the next line becomes effortful.
02
Change one variable
Keep the face and size fixed while comparing two measures. Then hold the preferred measure while adjusting line height. A ch value is based on a glyph metric, not a guarantee of a particular character count in every typeface. Treat it as a useful constraint that still requires inspection.
03
Review the exceptions
A long URL, an italic phrase and a superscript can reveal problems absent from ordinary paragraphs. Use wrapping rules for genuinely unbroken content, and avoid justifying a narrow column if it creates distracting gaps. The body should remain comfortable when the reader enlarges text or the container becomes narrower.
03 / MAKE SOMETHING
Your guided lab
Create a reading specimen with three paragraphs, one inline link, one emphasized phrase and a long unbroken string.
Compare two measures and record where line tracking becomes easier or harder.
Adjust line height without changing the measure or size.
Test narrow width and enlarged text, repairing overflow without clipping the passage.
What to produce
A body-text specification with actual reading observations and tested edge content.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful specification records the face, size, line height, maximum measure and wrapping policy, plus the content used to evaluate it. A comfortable result may differ from a familiar numeric rule of thumb. Preserve paragraph separation and link visibility. If a long URL is the only failure, fix that exception rather than shrinking all prose. The specimen is evidence that the system was read, not merely viewed from a distance.
If something is not working
The page looks elegant but is tiring to read
Inspect measure and line spacing over several paragraphs, not only the opening.
One string causes sideways scrolling
Allow appropriate wrapping and check the parent’s minimum-width constraints.
Take it one step further
Two fonts at 18px feel very different in density. Is matching their nominal size enough for a fair reading comparison?
Reveal the reasoning
No. Their proportions and perceived size differ. Adjust the comparison to a similar reading impression, then evaluate measure and line height. Record the actual settings so the final choice can be reproduced.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Your CSS says 65ch. What proves the line length is appropriate?
The number 65 itself
Reviewing real paragraphs at the intended sizes
The same width on every device
Reference answer
B. A unit is a constraint, not a substitute for a reading test.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Deliver a specimen someone can use
A type system is finished when another person can apply it to unfamiliar content.
Describe the contract
For each role, name its purpose, values and permitted exceptions. Show a good example and a failure. Include font file sources, licenses and a fallback stack. A fallback may wrap differently, so check the initial loading state as well as the final font. Reserve layout space where possible and avoid hiding content while fonts load.
Worked example
Interval uses the display face for article openings but never for navigation. Its caption rule allows two lines and follows the image rather than aligning every caption to a forced height. The specimen includes a three-line title and a missing-image state so a future editor sees the boundaries rather than only the ideal example.
Capstone practice
Finish the two Interval pages. Mark the first, second and third visual priorities. Run the long-title and zoom checks, then capture one revision with its reason. Use the project checklist to assess the result; a decorative cover alone does not demonstrate the article system.
Review criterion
Have another person compose a new caption and subheading from your notes. If they must invent a size or ask what belongs together, add the missing rule or simplify the system.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Turn choices into roles
Document display, standfirst, body, caption and interface labels with examples. Include the intended use and a boundary: the display role is for article titles, not long explanatory paragraphs. A list of font files and sizes is incomplete because it does not tell another person when each role belongs.
02
Include the awkward cases
Show a long headline, a short headline, numerals, punctuation and a caption that wraps. Add the narrow composition and a fallback rendering. If a font loads late or is unavailable, the content should remain readable and the page should not depend on a single exact line break.
03
Explain the handoff
Record font licensing or the source of the approved local assets, supported weights and any optical adjustment. Distinguish a chosen design decision from a technical requirement. Another designer should be able to extend the journal without reverse-engineering every screenshot.
03 / MAKE SOMETHING
Your guided lab
Finish the Interval specimen and ask a peer to apply it to a new article opening.
Publish the role table, usage guidance and responsive examples.
Add at least four difficult-content cases and note the intended behavior.
Observe the peer’s application, then revise any rule that required verbal explanation.
What to produce
A compact typography guide and a new article composed from it.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The finished guide connects voice to roles and roles to actual settings. It includes a rationale for the pairing, comfortable body measure, long-title behavior and fallback expectations. The peer test is valuable because it exposes instructions that were obvious only to the original designer. A good handoff makes future decisions easier while leaving room for editorial judgment; it does not prescribe every line break as an immutable rule.
If something is not working
The guide is a gallery of images only
Add the role names, settings and usage conditions needed to recreate them.
Every exception becomes a new role
Check whether a content-specific adjustment can preserve the existing hierarchy.
Take it one step further
A new article has an unusually long title. Should the contributor invent a smaller title style?
Reveal the reasoning
First apply the documented long-title behavior. If that behavior fails repeatedly for legitimate content, revise the system and its examples. An isolated workaround should not silently become a competing typographic language.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which artifact best demonstrates a reusable type system?
A single beautiful title
A specimen with roles, real content and documented edge cases
A list of twelve fonts
Reference answer
B. Roles and tested boundaries help another person make consistent decisions.
Capstone project
Design the opening and article page of a journal called Interval. Use the same 300-word article at 390px and 1280px. Pair a display face with a readable text face, then explain the role of each. Include a caption, a pull quote, a long title and one navigation action.
Collect the real article, headline and caption before choosing fonts.
Compare two pairings in the same layout; keep the one with clearer hierarchy.
Stress the final specimen with a long title and 200% browser zoom.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Assign five named type roles with sizes and line heightsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Show the same content at 390px and 1280px without clippingEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep article lines within your documented reading measureEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Demonstrate visible keyboard focus and text resizingEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Include font sources, license notes and a one-page specimenEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Turn references into an original visual system, then prove it across a campaign, a page and a small screen.
For: Designers moving from attractive compositions to defensible visual direction. Before you begin: Comfort making layouts and working with images. Supply your own or licensed assets. Your outcome: A three-format campaign with an explicit visual thesis and a documented critique trail.
16 min reading · 120 min labs · 120 min project. Planning estimates.
Course map
From reference to rule — Extract useful principles and build a specific visual thesis.
From rule to campaign — Maintain identity across formats and defend revisions with evidence.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Extract principles, not appearances
A reference can teach you about hierarchy without becoming a layout to copy.
Separate the layers
Describe a reference through composition, scale, contrast, image treatment and pacing. Then name the job each decision performs. “Large empty margin isolates the date” is transferable; “put the same object in the same corner” is a surface imitation. Collect contrasting sources so a single work does not silently become your entire direction.
Worked example
Afterlight is an evening exhibition of small luminous objects. One architectural reference teaches you to use darkness as space. A timetable teaches concise information order. A printed invitation contributes a quiet edge detail. Combine those principles into a new composition with an original light study and a clear date block; do not reuse the referenced artwork without permission.
Practice
Choose three legally accessible references. For each, write one observed design decision, the effect it has, and a different way you could achieve that effect. Make a small black-and-white sketch using only those translated principles. Credit the references in your working notes.
Common mistake
“Premium, bold, clean” does not tell a collaborator what to do. Replace each adjective with a decision and a tradeoff: generous margins emphasize the object but leave less room for explanatory copy.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Observe before collecting
For Afterlight, a fictional evening exhibition, choose three references for distinct reasons. One may use a small object inside a large margin; another may create energy through a sharp crop; a third may separate practical information with a restrained type block. Write what the visual decision does, not merely what objects appear in it.
02
Separate the principle from the motif
“A red circle in the top right” describes a motif. “One high-contrast shape establishes a focal point inside a quiet field” describes a principle. The second can produce an original composition using a different shape, placement and palette while preserving the useful relationship.
03
Test with your content
Apply the principle to the actual exhibition title, date and location. A composition that works only after removing essential information is not suitable. Keep a trace from reference observation to your own rule to the resulting layout, so the reference remains a source of reasoning rather than an unexamined template.
03 / MAKE SOMETHING
Your guided lab
Build a three-reference analysis and three original thumbnail compositions for Afterlight.
For each reference, describe one relationship involving scale, contrast, crop or rhythm.
Rewrite each observation as a rule that does not name the original motif.
Apply those rules to the exhibition facts using different imagery or geometry.
What to produce
A reference-to-principle sheet and three original compositions with annotations.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful analysis might identify quiet margins, a single dominant form and a separate information register. Your output could use a lime disc and narrow factual text even if the source used photography and a red square. The goal is not to disguise a copy; it is to understand the decision well enough to produce a different answer for your own content. Reject a principle if it obstructs the exhibition’s essential information.
If something is not working
The new layout is recognizable as the reference
Change the composition and test whether you understood the relationship or merely retained the arrangement.
The moodboard has no consequences
Write a rule and use it to accept or reject a specific design decision.
Take it one step further
Two references contradict each other: one is dense and one is quiet. Must you average them?
Reveal the reasoning
No. Identify which aspect of each serves the brief. You might take the first reference’s typographic confidence and the second’s spatial restraint. A direction is a chosen set of relationships, not a blend of every collected image.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which reference note is actionable?
Make it luxurious
A large quiet margin gives the small object visual importance
Use this exact layout
Reference answer
B. The note names a mechanism and an effect, so you can interpret it originally.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Write a visual thesis you can test
A direction should explain how the page will feel and how it helps the audience act.
Connect promise and form
Use one sentence linking audience, idea and visual behavior. Then choose three constraints that make the sentence visible. Constraints narrow the range of possible decisions; they do not specify every pixel. Include the information the campaign must communicate before deciding how much room can be atmospheric.
Worked example
“Afterlight invites first-time visitors to notice small objects through dramatic scale changes and precise captions.” Rules: one object dominates each composition, captions sit in a consistent type system, and the date/action remain outside the image. A dense collage violates the first rule even if it looks exciting. A tiny date violates the visitor’s task.
Practice
Build two routes for the same exhibition: an intimate editorial route and a graphic poster route. Keep the title, date, venue and action identical. Show both at thumbnail size and actual reading size. Explain which route better serves someone deciding whether to attend.
Common mistake
Judging only at presentation scale favors large decorative gestures. Also inspect a small phone crop and a distant poster view, because those are different encounters with the same idea.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Make the thesis observable
“Sophisticated and bold” is difficult to test. For Afterlight, try: “A single luminous form interrupts a quiet dark field; practical information stays in a compact, orderly register.” This suggests decisions about focal count, contrast, spacing and information hierarchy without dictating every final coordinate.
02
Define the boundaries
State what the direction avoids and why: multiple competing focal objects would weaken the solitary-light idea; decorative text distortion would make dates harder to find. These boundaries should follow the concept and the visitor’s task, not become an arbitrary list of personal dislikes.
03
Challenge it with a difficult format
Place the thesis in a small event listing that needs a title, date, venue and action. If the luminous form leaves no room for the facts, reduce or reposition it. A useful thesis survives a practical constraint by guiding a new composition; a fragile one works only as a poster with almost no information.
03 / MAKE SOMETHING
Your guided lab
Write and test a visual thesis for the exhibition in a poster and a compact event listing.
Write one sentence describing the dominant visual relationship.
Choose three decisions that follow from it and two boundaries it establishes.
Apply it to both formats and record where it needed interpretation.
What to produce
A visual thesis with two applications and a short decision log.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The thesis should be specific enough that two designers can discuss whether a layout follows it, yet broad enough to support variation. In the compact listing, the luminous form might become a small accent beside the title while the factual register remains clear. That is an interpretation of the same direction. Preserve the concept’s relationship and the information’s usefulness rather than forcing a reduced copy of the poster into every space.
If something is not working
The thesis contains only mood adjectives
Describe observable relationships between form, type, image and space.
The concept hides required facts
Revise the composition or the thesis; essential information is part of the design problem.
Take it one step further
A beautiful option violates the thesis but makes the event facts clearer. How should you evaluate it?
Reveal the reasoning
Do not reject it automatically. Compare the thesis with the actual brief. The option may reveal that the direction needs refinement. Keep the decision explicit: either revise the thesis for a stronger reason or choose a composition that satisfies both clarity and the intended visual relationship.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Your strongest route hides the date inside an image. What is the next test?
Remove the date
Give practical information its own clear hierarchy
Make the image more complex
Reference answer
B. The atmosphere must coexist with the visitor’s decision, including when and where.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Keep the identity; change the composition
Consistency comes from recognizable relationships, not identical layouts at every size.
Define invariants
Choose what stays stable: palette, type roles, image behavior, mark placement logic and tone. Allow columns, crop and spacing to change with context. A poster can hold a short statement while a landing page needs explanatory evidence. Each format must perform its own job without abandoning the campaign’s visual thesis.
Worked example
The Afterlight poster uses a tall image and large title. The mobile invitation places a tighter crop below the date so the action appears early. Both share a dark field, fine caption rules and the same title voice. The object is recropped, not squeezed; a narrow screen should not force unreadable type simply to mimic the poster.
Practice
Apply your chosen route to all three capstone formats. Add one stress case to each: a longer venue name, a portrait photograph and a translated title. Change the composition while keeping the rules recognizable. Note which rule needs an explicit exception.
Review criterion
Cover the logo. The three pieces should still feel related through image logic and hierarchy. If they only match because of the logo, strengthen one shared relationship rather than adding more repeated decoration.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Identify the invariants
For Afterlight, retain the palette, the relationship between the luminous form and quiet field, and the factual type register. These are the identity’s constants. The object’s scale, crop and placement can change with the format. Write this distinction before producing a family of layouts.
02
Recompose the narrow format
A poster may place the form above the title; a narrow story format may use a partial crop behind a clear text zone. Do not simply scale the poster until its date becomes unreadable. Change the composition so the essential content has a deliberate place in the new shape.
03
Compare the family
Place the poster, listing and mobile opening side by side. They should feel related without being identical. Look for a format that drifted into a different type voice or a different number of focal points. Also look for a layout that is technically consistent but fails its own reading task.
03 / MAKE SOMETHING
Your guided lab
Create three Afterlight applications: a poster, a compact listing and a mobile event opening.
Write a fixed-versus-flexible rule table for the identity.
Compose each format independently using the same content hierarchy.
Review the family at actual display size and revise the weakest application.
What to produce
Three related compositions and a short explanation of what changed between them.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A successful family repeats the visual logic, not every dimension. The mobile opening may use a smaller form and a larger relative text area; the poster can afford more atmospheric space. The venue and date remain easy to find in both. The compact listing should not become a miniature poster with unreadable metadata. Explain each adaptation through the format’s task and constraints, so the system can support a fourth format later.
If something is not working
Every format is a scaled poster
Rebuild the composition around the new reading distance and information needs.
The family loses its identity
Check whether the fixed palette, type roles or dominant relationship changed unintentionally.
Take it one step further
A square format cannot preserve the poster’s generous top margin. Does that mean the identity has failed?
Reveal the reasoning
Not necessarily. The margin is one way to express quiet space, not the only way. Preserve the relationship through another composition, such as a smaller focal form or a calm text zone, while keeping the information legible.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A portrait crop breaks the desktop arrangement. What preserves the direction?
Stretching the image
Recomposing the layout using the same visual rules
Reducing all text equally
Reference answer
B. A direction can survive a different arrangement when its relationships remain consistent.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Critique a decision, then revise it
A critique is useful when it names an observable problem and a testable change.
Structure the feedback
Describe what you see, identify which reader task it affects, and propose a small experiment. Keep preference separate from evidence. “I like blue” is preference; “the date has less contrast than the caption and is missed in a quick scan” identifies a hierarchy problem. Record the before/after result so revisions accumulate knowledge.
Worked example
A five-second review of Afterlight leaves readers with the exhibition name but no idea it happens in the evening. You test moving the time alongside the date, keeping its type size. If the time becomes easy to identify without overpowering the title, the hierarchy improved. Changing the entire palette would make the cause of improvement difficult to isolate.
Capstone practice
Ask a peer to identify the offer, time and next action in each format. Do not coach them. Revise the weakest composition, then repeat the same questions. Deliver the three final pieces alongside two concise critique entries and source credits.
Common mistake
A unanimous preference is not the same as a usable result. Keep the campaign’s audience and information requirements in view, and describe any uncertainty your small review cannot resolve.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
State the evaluation criteria
Before showing the work, name the intended story, required facts and visual thesis. Without these, feedback often becomes a contest of preferences. Ask reviewers where their eye goes first, what they think the event is, and which practical detail they would need next.
02
Distinguish observation and proposal
“I missed the date” is an observation. “Put it in a red box” is one possible proposal. First locate the cause: low contrast, poor grouping, excessive competing emphasis or an unexpected position. Then choose a revision that addresses the cause while preserving the direction.
03
Check the revision across formats
A larger date may repair the poster but crowd the compact listing. Revisit the rule at the system level: perhaps factual information needs a stronger register in every application. Repeat the same review question after changing it, and record whether the original problem improved.
03 / MAKE SOMETHING
Your guided lab
Critique the three Afterlight applications and make one evidence-based revision to the family.
Collect observations using the same three questions for each format.
Choose the most consequential issue and write a causal hypothesis.
Revise the responsible rule, then repeat the focused review.
What to produce
A final three-format identity with a before/after critique record and rationale.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The final record should show what was observed, why the designer believed it happened, what changed and what the repeated review revealed. For instance, grouping venue and date beneath the title may improve practical comprehension without introducing another dominant color. A reviewer’s preference can still be useful, but label it as preference when it is not tied to a task or brief criterion. The capstone demonstrates both a strong direction and the judgment to revise it.
If something is not working
Feedback is too vague to act on
Ask for the location and consequence of the problem, then restate it as an observation.
Every comment becomes a change
Prioritize against the brief and test the most consequential hypothesis first.
Take it one step further
One reviewer wants more energy, another wants more restraint. What is the next useful question?
Reveal the reasoning
Ask which specific relationship is failing the intended event story or reading task. “Energy” may mean a weak focal point; “restraint” may mean competing labels. Those observations can sometimes be resolved by the same hierarchy change.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which critique leads to a useful revision?
It needs more energy
The time is missed; test grouping it with the date
I prefer the other font
Reference answer
B. It identifies an observation, a task and an isolated change.
Capstone project
Create a campaign for a fictional evening exhibition called Afterlight. Deliver an event poster, a landing-page opening and a mobile invitation. Use one visual thesis across all three; include the audience, source credits, two discarded routes and a short account of what each critique changed.
Write the exhibition promise and identify the information hierarchy.
Develop two contrasting directions using the same words and images.
Apply the chosen rules to three formats and critique the weakest one.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
State an audience-specific visual thesisEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Identify transferable principles from three credited referencesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Produce three formats with consistent rules and different compositionsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep date, venue and action readable in every formatEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Document two revisions with observable reasonsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Plan a focused interview study, separate evidence from inference, and turn observations into a decision you can revisit.
For: Designers and makers investigating an uncertain product decision. Before you begin: Access to a consenting peer for practice, or use the clearly fictional scenario supplied in the lessons. Your outcome: A small-study plan, evidence table and decision brief with explicit uncertainty.
16 min reading · 120 min labs · 120 min project. Planning estimates.
Course map
Frame and listen — Turn a product uncertainty into a focused, neutral interview guide.
Interpret and decide — Trace a recommendation back to observations without overstating the sample.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Start with the decision at risk
Research becomes easier to scope when you know which decision it could change.
Frame the uncertainty
Name the proposed action, the assumption behind it and the consequence of being wrong. A broad goal such as “understand productivity” cannot guide a short study. A focused question such as “what context do people need when returning to an unfinished project?” suggests specific recent episodes to investigate.
Worked example
A team proposes daily reminder notifications. Its assumption is that people forget projects. A different explanation is that people remember but cannot reconstruct the next step. Interviews should investigate returning to work, rather than ask whether reminders sound useful. The two explanations suggest different product responses and different evidence to seek.
Practice
Write a decision statement for a personal-project tool. List two competing explanations for stalled work and the observations that would weaken each. Recruit based on recent experience of the situation, not enthusiasm for your proposed solution. Use a peer rehearsal if recruitment is not possible and label its limits.
Common mistake
A small convenience sample cannot establish market prevalence. It can expose a mechanism or challenge an assumption. Phrase findings as observations from the study rather than percentages about all users.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Name the decision
The fictional product team is deciding whether to build reminders for unfinished projects or improve the way people resume them. That is a choice between interventions. “Learn about productivity” is too broad to guide a short study. Identify the uncertain assumption: are people forgetting to return, or returning but unable to recover context?
02
Choose a useful episode
Ask about a recent unfinished project that the participant actually returned to or abandoned. Recent concrete episodes give you actions, artifacts and sequence to inspect. General opinions about being productive can be interesting, but they do not establish which part of this particular journey caused difficulty.
03
Set a decision boundary
Write what would support each option and what would leave the question unresolved. A small exploratory study can reveal mechanisms and important exceptions; it cannot establish a population percentage. Treat the study as evidence for the next decision or experiment, with explicit limits.
03 / MAKE SOMETHING
Your guided lab
Create a small research plan for the reminder-versus-resume decision. Use consenting participants or clearly labeled fictional rehearsal material.
Write the decision, two competing explanations and the most important uncertainty.
Define the relevant recent episode and who can speak about it.
Describe evidence that would favor each option and a result that would remain inconclusive.
What to produce
A one-page research plan with scope, recruitment criteria, consent approach and decision conditions.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The plan might recruit people who paused a creative project and returned within the last month. It asks for the actual sequence, what they looked for and what they tried. Evidence of forgotten intention supports a different intervention from evidence of missing context after return. Include both possibilities in the guide. If participants mainly describe unrelated deadline pressure, acknowledge that neither proposed feature has yet earned support.
If something is not working
The question assumes the proposed feature is needed
Rewrite it around the episode and competing explanations.
The sample is described as representative without evidence
State the recruitment scope and avoid prevalence claims from a small convenience sample.
Take it one step further
Every participant likes the idea of a reminder. Does that settle the decision?
Reveal the reasoning
No. Stated liking does not show that forgetting caused the observed problem or that reminders would help. Examine concrete episodes, existing coping behavior and counterexamples before choosing an intervention.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
You want to know whether reminders solve stalled work. Which question is more useful?
Would you use our reminder feature?
Tell me about the last time you returned to an unfinished project
Do you like productivity apps?
Reference answer
B. A concrete episode can reveal the actual obstacle before you introduce your solution.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Ask for the episode, then follow it
The most informative detail often appears after the first general answer.
Use a neutral sequence
Ask what happened, what the person did next, and what information they used. Follow their wording rather than supplying a preferred explanation. Ask permission before recording; written notes may be enough. Explain how notes will be used and avoid collecting identifying or sensitive material that the decision does not require.
Worked example
A participant says, “I lost track.” Instead of asking “So a notification would help?”, ask “What did you do when you opened the project?” They describe searching three documents for the last decision. That episode suggests a context-recovery issue, while their original phrase could have meant several things. Preserve the distinction in your notes.
Practice
Write a six-question guide: introduction/consent, recent episode, sequence, obstacles, workaround and closing. Rehearse it with a peer for ten minutes. Note every question that assumes a motive or includes your feature. Rewrite those prompts, and leave room to follow an unexpected answer.
Common mistake
Filling silence with your own explanation can turn an interview into a sales conversation. Pause, then ask a short follow-up. Accept “I do not remember” as data about the limits of the account.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Begin at a concrete moment
Ask: “Tell me about the last time you returned to a project after leaving it for a while.” Establish when it happened, what the project was and what they did first. Invite the participant to refer to an artifact if they are comfortable, without requesting unrelated private information.
02
Follow the sequence
If they say “I was lost,” ask what they were looking at and what they tried next. Do not immediately translate lost into a need for your proposed dashboard. The missing information might be the last decision, the next action or the location of a file. Those mechanisms imply different design responses.
03
Leave room for contradiction
Ask about a time returning was easy and what differed. A successful episode can reveal a useful existing strategy, such as leaving a note before stopping. Summarize your interpretation back to the participant as a question rather than presenting it as a fact they must accept.
03 / MAKE SOMETHING
Your guided lab
Run a short rehearsal interview using a willing participant or a clearly labeled fictional role-play.
Prepare an opening episode question and five neutral follow-up prompts.
Record the sequence of actions and distinguish direct statements from your notes.
Ask for one contrasting successful episode and summarize the difference.
What to produce
An anonymized episode map with quotations or observations separated from interpretation.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful record reads: “Opened three files; searched for the previous sketch; said ‘I couldn’t remember why I chose that version.’” The interpretation might be lost decision context, but it remains labeled as interpretation. The successful episode may include a short end-of-session note. That contrast suggests something concrete to investigate without prematurely claiming that one participant’s strategy is universal. Preserve enough context that another reviewer can understand how the interpretation was reached.
If something is not working
The participant agrees with every proposed feature
Remove solution suggestions and return to what happened in a specific episode.
Notes contain only conclusions
Add the observed action or statement that supports each conclusion.
Take it one step further
A participant says “your new dashboard would fix this.” Should that become the main finding?
Reveal the reasoning
Treat it as a participant’s proposed solution, not proof of effectiveness. Ask which part of the episode they expect it to change, then compare that mechanism with the rest of the evidence and a future prototype test.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A participant says a task was “confusing.” What comes next?
Explain your redesign
Ask what they were looking at and what they tried
Record that every screen is confusing
Reference answer
B. Concrete context helps you distinguish the event from your interpretation.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Keep evidence and interpretation separate
A tidy theme is persuasive; traceability helps you decide whether it is justified.
Build an evidence table
Use columns for episode, observation, interpretation, counterexample and open question. Keep a source reference that you can trace without exposing unnecessary personal details. Themes should summarize recurring relationships, not merely reuse the most memorable quote. Look for disagreement and conditions under which a pattern changes.
Worked example
In a fictional rehearsal, P1 searches for a previous decision; P2 restarts easily using a checklist; P3 remembers the next step but lacks time. “Everyone needs reminders” ignores two different mechanisms. A narrower theme is that a visible next action may help reconstruct context, while time constraints remain a separate problem. This is a hypothesis to test, not a measured population claim.
Practice
Code six observations from your notes. For every proposed theme, attach supporting episodes and one uncertainty. Rewrite any theme that cannot be traced. Keep direct quotations exact; use paraphrases when the original words were not recorded accurately.
Common mistake
Frequency in a tiny sample is not the only indicator of importance. A single severe barrier can matter, but describe its severity and source instead of inflating how common it is.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Create an evidence table
Use columns for episode ID, observation, context, interpretation and uncertainty. An observation such as “searched chat history for the last decision” differs from the interpretation “needs a decision summary.” Keeping them separate lets a reviewer challenge the inference without disputing what was recorded.
02
Compare mechanisms
Group episodes by what blocked progress: forgotten intention, missing files, missing rationale or unclear next action. Do not group only by repeated words. Two participants can both say “lost” while describing different mechanisms. A useful pattern explains a relationship in the journey, not merely a frequent adjective.
03
Retain the exception
One participant may resume easily because they leave a note. Another may deliberately abandon low-value work. These exceptions can narrow the opportunity or reveal a better intervention. Removing them to make the story cleaner makes the decision less trustworthy.
03 / MAKE SOMETHING
Your guided lab
Synthesize at least three labeled rehearsal episodes or consented interview records into a small evidence map.
Separate observations from interpretations and attach an episode reference to each.
Group by the mechanism affecting the return-to-project task.
Write one pattern, one exception and one unresolved question.
What to produce
An evidence table and a bounded finding that a peer can trace back to its inputs.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A bounded finding could be: “In these episodes, returning participants often located the files but lacked the reason for the last decision. One participant avoided this by leaving a short stopping note.” This supports exploring context recovery, while acknowledging the study’s scope. It does not establish that all users need the same feature or that reminders have no value. The unresolved question might be whether people will reliably create useful stopping notes without extra friction.
If something is not working
The finding is a polished claim with no trail
Attach specific episode references and retain the observed detail.
Counts are treated as population estimates
Use them to describe this small set, not to infer prevalence beyond it.
Take it one step further
Two observations support a pattern and one contradicts it. Should the contradiction be excluded?
Reveal the reasoning
No. Examine what differs in context and whether the finding needs a narrower boundary. A contradiction can identify when a proposed intervention will not help, which is valuable information for design.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Two people struggle and one does not. What should the synthesis include?
Only the supporting quotes
The pattern, the exception and a possible explanation
A claim that all users struggle
Reference answer
B. The exception can reveal the condition under which the problem occurs.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Write a decision with an expiry condition
A useful research brief says what to try and what evidence would make you reconsider.
Make the reasoning visible
State the decision, strongest observations, competing explanation and next experiment. Keep scope proportional to the study. Distinguish what you learned about behavior from what remains unknown about feasibility or demand. An explicit revisit condition keeps a tentative decision from becoming permanent folklore.
Worked example
The project tool tests a “last decision / next action” note with five returning users. Success means they can identify a next step without reopening old documents; the team also observes whether writing the note is burdensome. This experiment addresses context recovery. It does not establish retention improvement or justify a forecast of paid conversion.
Capstone practice
Write your one-page brief with a source reference for each major claim. Include one recommendation you rejected and why. Ask a peer to trace the recommended experiment back to an observation. If the chain has a missing link, label the inference or gather more evidence.
Review criterion
A reader should understand what changed your mind and which future result would change it again. Remove unsupported certainty before polishing the presentation.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Separate finding and action
The finding describes what the study suggests about the return journey. The action is the team’s chosen response under practical constraints. A decision can be reasonable without claiming certainty. State why a small context-recovery prototype is the next useful step rather than presenting it as an inevitable conclusion.
02
Define the next observation
A prototype test could ask someone to resume a paused project using a short last-decision summary. Observe whether they can identify the next action and whether the summary is accurate enough to trust. Do not measure only whether they like the interface.
03
Give the decision an expiry condition
Reconsider if summaries are routinely stale, if creating them adds too much work, or if new evidence shows that people mainly forget to return at all. Naming those conditions makes the decision adaptable. It also prevents a small exploratory study from becoming permanent organizational folklore.
03 / MAKE SOMETHING
Your guided lab
Finish the research capstone with a decision note and a focused follow-up prototype plan.
State the chosen next step and link it to the strongest relevant evidence.
List the scope limits and the most consequential alternative explanation.
Define a follow-up task, its observations and the conditions that would change the decision.
What to produce
A traceable decision note, evidence appendix and a practical next-study outline.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The note should be clear enough for a teammate who did not attend the interviews. It can recommend a reversible prototype of context recovery while explicitly leaving reminder value unresolved. Include what the test will establish and what it cannot, such as long-term adoption. A successful capstone turns limited evidence into an appropriately limited action. It does not transform a few conversations into a universal product strategy.
If something is not working
The note reads like a feature sales pitch
Restore the alternative explanations and the conditions under which the proposal should be rejected.
The next test measures only preference
Choose an observable task outcome tied to the original uncertainty.
Take it one step further
A stakeholder asks for a precise revenue forecast from the study. What can you responsibly provide?
Reveal the reasoning
Explain that the study informs the mechanism and next design decision, not a revenue estimate. Identify the additional behavioral, market and commercial evidence a forecast would require. Do not give false precision to make the research appear more decisive.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What belongs beside a recommendation from a small study?
A precise revenue forecast
Its evidence, limits and a test that could overturn it
A universal claim about user behavior
Reference answer
B. A bounded decision is actionable without pretending that uncertainty has disappeared.
Capstone project
Investigate how people resume unfinished personal projects. Plan three interviews, practice with at least one consenting peer, and synthesize observations into a one-page design decision. If participants are unavailable, use an explicitly labeled fictional rehearsal and do not present it as real research.
Write the decision, uncertainties and recruitment criteria.
Pilot the guide and collect consented notes or labeled rehearsal data.
Build an evidence table and write a limited, traceable recommendation.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Tie the study to a specific decision and uncertaintyEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use neutral questions about concrete recent behaviorEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Record consent and minimize identifying detailsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Separate observations, interpretations and open questionsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Recommend one next experiment with a reason and limitationEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Write labels, errors and recovery paths that help people understand what happened and choose their next step.
For: Designers and developers responsible for the words inside products. Before you begin: A simple product flow to sketch; no coding required. Your outcome: A tested content system for a workshop-booking journey, including errors and empty states.
16 min reading · 120 min labs · 90 min project. Planning estimates.
Course map
Language as navigation — Write actions and labels that match the user’s intent.
Language as recovery — Explain uncertainty and failure without making false promises.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Name what happens after the click
A button label is a small contract about the next state.
Start with the action
Use a verb and a meaningful object when the destination is not obvious. “Review reservation” prepares someone for another step; “Confirm reservation” implies commitment. Decide what the system actually does before writing the label. Keep the terminology stable between the card, form and confirmation.
Worked example
A workshop page says “Get started,” then opens a date picker. Replacing it with “Choose a session” reduces ambiguity. The final action becomes “Confirm free reservation” only if no payment occurs. When payment is required later, the interface must describe that sequence accurately rather than borrowing reassuring language from another product.
Practice
List six actions in your booking flow. Beside each, write the next visible state and whether anything is committed. Rewrite labels whose meaning differs from their effect. Read them without nearby body copy to check that they still give a useful clue.
Common mistake
A playful label can work when its meaning remains clear. “Let’s do this” on a consequential action forces the user to infer the effect from context. Put personality into supporting copy while keeping the action precise.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Map the commitment
The sample journey has three distinct actions: choose a session, review a reservation and submit the local demonstration. A button labeled “You’re booked” before submission describes an outcome that has not happened. Name each action according to what the system actually does at that point.
02
Read label and context together
“Continue” can be clear inside a strongly labeled review step, but “Review reservation” is more self-explanatory when the destination might be uncertain. Avoid filling every button with an entire sentence. Let nearby context explain the consequence, especially if an action is irreversible or changes a commitment.
03
Test the prediction
Show the screen before activation and ask what the reader expects to happen. Compare that expectation with the actual next state. This is more informative than asking whether the label sounds polished. A calm, ordinary phrase that predicts the behavior is better than an expressive phrase that creates uncertainty.
03 / MAKE SOMETHING
Your guided lab
Write the primary and secondary actions for a workshop selection, review and local-confirmation sequence.
Describe the real state change behind each control.
Write labels and supporting context without claiming a booking before confirmation.
Ask a reader to predict the next screen from each label.
What to produce
A three-step copy flow with action labels, supporting text and prediction-test notes.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A coherent sequence might use Choose this session, Review reservation and Complete demo reservation, with a clear statement that no real seat is reserved. Secondary actions such as Change session should describe their destination rather than compete with the primary commitment. If the product later becomes a live booking service, revisit the labels and consequence text against the actual server behavior. Copy is part of the interaction contract, so changing behavior may require changing language.
If something is not working
The label describes the final ambition
Replace it with the immediate action or destination.
Every button says Continue
Inspect whether the surrounding context makes the next step sufficiently clear.
Take it one step further
A button opens a confirmation dialog rather than submitting immediately. Should it say “Booking confirmed”?
Reveal the reasoning
No. The label should describe the pending action, such as Review booking or Continue to confirmation. The completed-state message belongs after the system has established that outcome.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A button opens a review screen without booking anything. Which label fits?
You’re booked
Review reservation
Finish everything
Reference answer
B. The label should describe the next screen, not a commitment that has not occurred.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Build a vocabulary that survives the flow
Inconsistent nouns make people wonder whether two screens refer to the same thing.
Choose canonical terms
Define the product’s important nouns and verbs in a short terminology sheet. Include the meaning, preferred term and a sentence in context. Avoid internal implementation language when it does not help the user decide. Do not vary a term simply to make the writing sound less repetitive.
Worked example
A booking tool uses “class,” “event,” “workshop” and “session” interchangeably. Define workshop as the topic and session as its dated occurrence. Then “Choose a workshop” and “Choose a session” refer to different decisions. A session card should repeat its workshop name so the distinction remains visible.
Practice
Write a terminology sheet for five concepts. Apply it to a card, confirmation and cancellation message. Ask a peer to explain the difference between a workshop and a session. If your definitions are not reflected in the interface, simplify them rather than adding a glossary users must study.
Common mistake
Removing every repeated word can make a flow harder to follow. Repetition is useful when it confirms that the same selected session persists across steps. Vary sentence structure before varying core terms.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Choose the unit of meaning
The catalogue calls an event a workshop, its scheduled occurrence a session and the user’s intended attendance a reservation. These words identify different objects. If the interface alternates session, class and slot for the same occurrence, the reader has to decide whether the terms imply a difference.
02
Create a term table
For each term, write a definition, an example and any prohibited synonym. Include verbs: choose a session, review details, change a selection. A glossary is useful only when it resolves actual ambiguity. Avoid documenting dozens of obvious words while leaving the key product objects undefined.
03
Follow the term through an edge case
A selected session becomes unavailable before submission. The error should refer to the same session name shown in the summary, not suddenly call it an event option. Consistent references help the reader identify what changed and what action will repair the situation.
03 / MAKE SOMETHING
Your guided lab
Build a five-term vocabulary for the workshop flow and audit all visible states against it.
Define the core objects and the verbs that act on them.
Review selection, summary, validation, unavailable and confirmation copy.
Resolve one ambiguous term and document the change in every affected state.
What to produce
A concise terminology guide and an audited copy sheet for the complete flow.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful guide distinguishes workshop from scheduled session and avoids switching between reservation and purchase when no payment occurs. It includes the names of concrete objects so an error can point to the affected choice. Consistency does not mean repeating the same sentence everywhere: a heading, action and status message have different jobs. They should share a vocabulary while each supplies the information needed at its point in the journey.
If something is not working
Variety creates uncertainty
Use different language only when the product meaning actually differs.
A glossary never reaches the interface
Audit complete states and record where each chosen term appears.
Take it one step further
Marketing prefers “experience,” but the booking interface uses “session.” Must one word disappear?
Reveal the reasoning
Not necessarily. An expressive marketing phrase can coexist with precise task language if the relationship is clear. Use the unambiguous product term where people choose dates, review details or recover from an error.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
The same dated event is called a class, slot and session. What should you do?
Keep all three for variety
Choose one term and apply it consistently
Hide the name after selection
Reference answer
B. Stable terminology reduces the need to infer whether the object has changed.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Turn an error into a next step
An error message should identify the problem at the level where someone can fix it.
Explain and recover
Name the affected item, describe the problem in ordinary language, and provide a possible next action. Preserve entered data when safe. Avoid blaming the person for a system failure. Place field-specific feedback beside the field and provide a summary when several errors need attention.
Worked example
“Invalid input” does not help someone who typed a date in another format. “Enter a date as day/month/year, for example 18/09/2026” supplies a concrete repair. If the server is unavailable, a different message is needed: “We could not check availability. Your details are still here. Try again.” Do not claim the reservation succeeded when only the request was sent.
Practice
Write messages for a missing email, full session, lost connection and duplicate submission. For each, state what the system knows and what it does not know. Draw the recovery action and the information that remains on screen.
Common mistake
“Something went wrong” can be honest but insufficient. When the exact cause is unknown, say what failed and give a safe next step. Avoid invented explanations that would mislead support or the user.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Separate known and unknown outcomes
“The workshop is full” is appropriate only when availability has been established. If the availability request failed, the system knows less: it could not check. This distinction changes the next action. An unavailable session suggests choosing another; an unsuccessful check may suggest retrying.
02
Connect the message to the repair
An email-format error should identify the email field and explain the expected form. A failed submission should state whether the entered details remain available. Avoid blaming the reader or using a generic error code as the only explanation. Technical detail can be available separately if it helps support.
03
Review the surrounding state
The message is only one part of recovery. Check that the relevant field remains editable, valid input is preserved and the retry action is enabled when appropriate. Clear the obsolete message when the user corrects the condition or a later operation establishes a new outcome.
03 / MAKE SOMETHING
Your guided lab
Write copy for invalid email, unavailable session, slow request, failed availability check and local success.
State what the system knows in each case and what it does not know.
Pair each message with a specific repair or next action.
Read the message alongside the field, button state and retained input.
What to produce
Five edge-state messages with their trigger, recovery action and clearing condition.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
For a failed check: “We couldn’t check this session’s availability. Your details are still here. Try again.” For an established unavailable result: “This session is no longer available. Choose another time.” The wording differs because the evidence differs. The success state should explicitly identify the local demonstration when no real booking service exists. A good copy sheet includes when each message disappears, preventing an old error from surviving a successful retry.
If something is not working
The message asserts more than the system knows
Replace the invented outcome with the actual known failure or uncertainty.
The repair is described but unavailable
Coordinate copy with interaction state; an instruction must lead to a usable control.
Take it one step further
The request times out after submission and the server outcome is unknown. Is “Nothing was saved” safe wording?
Reveal the reasoning
Not unless the system can establish that fact. Explain the uncertainty and provide a recovery route that avoids accidental duplicate commitments. The exact wording depends on the real service contract, not on the desire to make the message reassuring.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Availability could not be checked because the request failed. What can you safely say?
Your place is reserved
We could not check availability; try again
The workshop is full
Reference answer
B. A failed request gives no evidence that the session is full or the reservation exists.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Review the journey as a reader
A sentence can be clear in isolation and confusing beside another sentence.
Test comprehension
Walk through the flow with someone unfamiliar with the project. Ask what they think happened and what they expect the next action to do. Avoid asking only whether they like the tone. Record hesitation and mismatched expectations, then identify the wording or missing context that caused them.
Worked example
The review screen says “Almost there” while the button says “Done.” A participant believes the reservation already exists. Replacing the heading with “Review your session” and the action with “Confirm reservation” makes the pending state explicit. The success screen then includes the selected date and a clear confirmation statement.
Capstone practice
Deliver the main booking flow and five edge states. Include an empty saved list and an unavailable session. Stress every action label at a narrow width. Record two observed misunderstandings and show the revised copy alongside the original.
Review criterion
Someone should be able to identify the current state, the available action and the consequence without reading a help article. Check accuracy before adding charm.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Read by task, not by component
Walk through the entire reservation sequence as a first-time reader. A button label that looks clear in a component library can become ambiguous beside another action on the actual screen. Include headings, hints, summaries and status messages in the same review.
02
Ask application questions
At each point, ask what the reader believes is selected, what happens next and how they would change their mind. Use a realistic session name and a long label. Record uncertainty before proposing wording changes. Preference questions alone tend to reward familiar phrases without establishing whether they help the task.
03
Deliver behavior with the copy
The final handoff identifies each string’s context, trigger and variable content. Specify how a session title or date is inserted and what happens when it is long. Include the demonstration disclaimer and avoid implying that an illustrative confirmation creates a real reservation.
03 / MAKE SOMETHING
Your guided lab
Complete the booking copy capstone and review it with a reader unfamiliar with the project.
Run the normal journey and two recovery paths using the same vocabulary.
Record prediction errors and revise the specific wording or context responsible.
Package the copy with state triggers, variable examples and clearing conditions.
What to produce
A production-oriented copy sheet and a short comprehension review.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The final result should make the selected session, commitment level and next action clear at every step. It preserves a consistent vocabulary and explains uncertainty without inventing certainty. The review record should identify what was observed and what remains untested. A polished set of sentences is only part of the output; the associated states and triggers let a developer place those sentences where they are true and useful.
If something is not working
The handoff contains isolated strings
Add screen context, trigger conditions and realistic variable examples.
A reader cannot explain the next step
Review the action and supporting context together instead of changing a single word repeatedly.
Take it one step further
A reader correctly predicts the next action but dislikes the tone. Does the wording automatically need to change?
Reveal the reasoning
Treat prediction and tone as separate criteria. Preserve the clear interaction contract while refining tone against the brand direction. Do not sacrifice meaning simply to make a phrase sound more distinctive.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which question best tests an action label?
Do you like this wording?
What do you expect to happen when you select this?
Does it sound premium?
Reference answer
B. Expected behavior reveals whether the label communicates its contract.
Capstone project
Write the complete booking journey for an independent workshop: choose a date, enter details, review, confirm and recover from an unavailable session. Include five edge states, a terminology sheet and a short comprehension review.
Map the decisions and information needed at each step.
Write the main flow plus five failure or empty states.
Run a comprehension walkthrough and revise ambiguous wording.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Use consistent names for sessions, places and reservationsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Make button labels describe the next actionEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Explain errors beside the affected input with recovery guidanceEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Distinguish pending, successful and failed reservationsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Test the flow with long labels and a first-time readerEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Build a keyboard-usable interface with meaningful structure, visible focus and honest status feedback.
For: Frontend developers and designers who can build a basic page. Before you begin: HTML forms, CSS selectors and basic DOM events. Your outcome: An accessible reading-list flow with tested navigation, a dialog and error recovery.
18 min reading · 120 min labs · 120 min project. Planning estimates.
Course map
Structure and operation — Build meaning with native elements and predictable keyboard access.
Feedback and verification — Make state changes perceivable and test the actual journey.
LESSON 1 / 5 min read / 30 MIN PRACTICE
Start with the element’s job
A visually convincing control can still be impossible to operate without a pointer.
Choose native semantics
Use links for navigation and buttons for actions. A button supplies keyboard activation and a role; adding a click handler to a generic box does not supply the same contract. Labels connect fields to their purpose. Headings and landmarks organize the page beyond its visual appearance.
Worked example
A book card contains a title link and a separate Save button. The button uses aria-pressed to communicate saved state and changes its visible text to “Saved.” The card itself is not a nested button around other controls. A result message reports the updated count without moving focus away from the action.
Practice
Build one card using a title link, description and Save button. Tab through it. Verify that Enter follows the link and Space activates the button. Check that the accessible name still identifies the action when the visual icon is hidden.
Common mistake
Adding ARIA to every element can replace useful native meaning with incorrect claims. Prefer the element that already performs the job, then add only the state or description it genuinely needs.
<button type="button" aria-pressed="false">
Save The Quiet City
</button>
<p role="status" aria-live="polite"></p>
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Classify the action
The reading page contains navigation to a book, a local save action, a search field and a details dialog. A link navigates; a button performs an action; a labeled input collects a value. Start with those jobs before styling. Recreating a button from a span adds keyboard and semantic work that the native element already provides.
02
Name the control in context
A visible “Save The Quiet City” label is clear in a small list. If the visual design uses a shorter label, ensure the accessible name still distinguishes repeated controls when needed. Keep the name aligned with visible wording. An icon’s appearance alone does not establish a reliable name or state.
03
Keep state perceivable
A toggle-style save button can expose its pressed state while retaining a stable label. Alternatively, an action label can change from Save to Remove from saved, provided the behavior is clear. Do not combine state conventions inconsistently. Test the resulting name and role in the browser’s accessibility representation.
03 / MAKE SOMETHING
Your guided lab
Build a semantic reading-list skeleton with search, title links, save buttons and a details trigger.
List each control’s job and select the corresponding native element.
Add visible labels and a logical heading structure.
Navigate and activate every control with the keyboard before adding decorative styles.
What to produce
A semantic page skeleton and a control inventory showing name, role and intended state.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The page should remain understandable without its visual styling. Each title link has a real destination or a clearly identified local route; each save button performs a local state change. Search has a persistent label. The page’s heading hierarchy describes the content rather than reproducing font sizes. This is a foundation for accessibility, not a complete conformance claim: the finished interaction still needs focus, feedback and content review.
If something is not working
A clickable element cannot be reached by keyboard
Replace it with the appropriate native control before adding custom key handlers.
Repeated controls have indistinguishable names
Review the accessible name in the surrounding task and include the relevant object where useful.
Take it one step further
A card navigates to a detail page and also contains a save action. Should the whole card be a button?
Reveal the reasoning
Use separate semantic controls for separate jobs, such as a title link and a save button. Avoid nesting an interactive control inside another. A larger visual hit area can be designed without making the document’s interaction structure ambiguous.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which element should save a book without navigating?
A span with a click handler
A button with a clear name and saved state
A link with href="#"
Reference answer
B. Saving is an action; a native button supplies the expected keyboard behavior.
LESSON 2 / 5 min read / 30 MIN PRACTICE
Make focus follow the task
Keyboard focus is the current place in an interaction, not a decorative outline.
Plan the sequence
Keep DOM order aligned with the reading order. Use a visible focus indicator with enough separation from nearby edges. When opening a modal dialog, choose an initial focus target inside it; for long content a focusable heading can be appropriate. Closing should return people to the control that opened it when that control still exists.
Worked example
A details button opens a native dialog. The heading explains the selected book, the close button remains available, and Escape dismisses the modal. After closing, focus returns to the details button. If the user removed the item inside the dialog, choose a sensible neighboring item instead of focusing a deleted node.
Practice
Sketch the focus sequence for open, inspect, close and remove. Implement the first three using dialog.showModal() and dialog.close(). Verify forward and reverse tabbing. Test the actual browser rather than assuming that the presence of a dialog tag guarantees a complete experience.
Common mistake
Removing outlines because they do not match the design leaves keyboard users without a position marker. Restyle the indicator with :focus-visible and review it against every surface.
Before opening details, remember which control initiated the action. Use a real modal dialog where appropriate and choose an initial focus target that supports the content. A short confirmation may focus a control; a longer reading dialog may need a focusable heading or introductory block so the start remains discoverable.
02
Keep the modal coherent
While the dialog is modal, background content should not compete for interaction. Provide a visible close control and verify Escape behavior. Keep the focus ring visible inside scrollable regions. Do not use a focus trap as a substitute for a correctly structured dialog and meaningful initial focus.
03
Return to the updated task
On close, return to the invoking control if it still exists and remains useful. If the action deleted that item, choose a predictable nearby control or a list heading. Returning to a detached element leaves the reader without a clear location. The return policy follows the changed task, not merely the original DOM reference.
03 / MAKE SOMETHING
Your guided lab
Implement a reading-item dialog and review opening, keyboard operation, closing and item removal.
Document the initial and return focus targets for normal and deleted-item cases.
Test the visible close control and Escape without using a pointer.
Scroll the dialog and inspect whether focus remains visible and meaningful.
What to produce
A working dialog with a documented focus lifecycle and keyboard observations.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The normal path opens details, places focus appropriately, keeps modal interaction contained and returns to the same item’s trigger. The removal path returns to the next useful location in the updated list. The page should not scroll unexpectedly because focus was sent to a remote hidden element. Review the actual browser behavior rather than assuming the native dialog handles every product-specific return decision automatically.
If something is not working
Focus returns to nowhere
Check whether the original trigger was removed or replaced during the update.
The focused control is hidden by scrolling
Inspect overflow, sticky elements and the chosen focus target’s position.
Take it one step further
The dialog contains a long article and a close button at the top. Must initial focus always go to the close button?
Reveal the reasoning
No. Choose a target that makes the content and purpose understandable without forcing the reader to miss its beginning. A focusable heading can be appropriate for long structured content. Verify the result with the intended dialog pattern and assistive technology.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
The item that opened a dialog was deleted. Where should focus go on close?
To a predictable nearby control or list heading
To a detached DOM node
Nowhere
Reference answer
A. Return to a meaningful place in the updated task when the original trigger no longer exists.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Report changes without creating noise
A changed screen is not automatically a perceivable state change.
Choose meaningful feedback
Use a concise status region for updates such as saved confirmation or result counts. Keep the live region in the DOM before changing its text. Avoid announcing every keystroke in a complex interface. Error text should identify the field and the repair, and aria-describedby can connect the explanation to that field.
Worked example
Searching for “coast” produces “3 books found.” A zero-result state repeats the query and offers Clear search. Submitting an empty required title marks that field invalid and displays “Enter a title.” The interface does not move focus to the result count on every search update, because doing so would interrupt typing.
Practice
Add search feedback and one recoverable validation error to the reading list. Inspect the accessibility tree and try a screen reader if available. Record exactly what you tested; a markup inspection alone does not establish how every assistive technology announces the result.
Common mistake
A rapidly changing live region can become a stream of interruptions. Report the result of an action and let people continue working. Keep essential feedback visible as well as announced.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Identify the useful update
After a search, the useful message might be “3 results for coast.” After saving, it might be “The Quiet City saved.” Announcing the entire updated list repeats information and creates noise. Keep status wording brief and tied to the user’s recent action.
02
Preserve the active control
Typing in search should generally keep focus in search while results update. A status region can communicate the result without requiring a focus jump. If updates happen on every keystroke, consider when a message becomes useful rather than announcing a stream of intermediate counts.
03
Distinguish urgency
A routine saved-state update does not require the same interruption as a blocking problem. Choose a feedback mechanism that matches the event and verify how it is exposed. A visually hidden live region that repeatedly rewrites identical text may behave differently from what its author assumes, so test the actual implementation.
03 / MAKE SOMETHING
Your guided lab
Add search-result and saved-item feedback to the reading-list flow.
Write concise messages for successful search, no matches, save and remove.
Keep focus on the control that initiated each routine update.
Test rapid changes and confirm that obsolete messages do not describe the current screen.
What to produce
A feedback map and working status messages that preserve keyboard continuity.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A coherent result pairs stable controls with concise status updates. A no-match message identifies the query and offers Clear search. Saving changes the button state and reports the affected title. Removing an item from a saved-only view needs a deliberate focus policy because the initiating control disappears. The status message and focus behavior solve related but different problems; neither should be used as a blanket substitute for the other.
If something is not working
Search moves focus after every key
Keep the editing context stable and communicate results through suitable status feedback.
Announcements become repetitive
Reduce them to meaningful changes and avoid restating whole regions.
Take it one step further
A saved-only list removes the item whose button was activated. Is keeping focus on the same button still possible?
Reveal the reasoning
The button no longer exists, so choose a logical replacement location in the updated list or its heading. Announce the removal separately. The goal is continuity in the task, not an impossible promise to preserve a deleted node.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Search results update while the user types. What should happen to focus?
Move to the first result every time
Remain in the search field
Jump to the page heading
Reference answer
B. The user is still entering a query; concise status feedback can report the change without stealing focus.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Review a complete journey
Accessibility is experienced through tasks and states, not a score on one screen.
Combine checks
Automated scans can find some structural defects. Manual keyboard use reveals order and traps; zoom exposes layout constraints; assistive-technology checks reveal announcements and names. Use all available evidence and describe the limits. Focus this course on a small flow so you can inspect its states carefully.
Worked example
The reading list passes a scan but the dialog closes after saving and sends focus to the top of the page. The task becomes tedious for keyboard users. Fix the return target, then repeat the original journey. A passing scan did not make that interaction correct, and one corrected flow does not certify the entire application.
Capstone practice
Complete search, open details, save and close using only the keyboard. Repeat at 200% zoom and with a long book title. Record failures with the triggering action, expected behavior and observed behavior. Fix the highest-impact barrier and rerun that exact sequence.
Review criterion
Deliver the working page and a short evidence log. List any browser or assistive-technology combination you could not test. Clear scope makes the review useful to the next person.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Choose a real journey
Begin with search, open a result, close the dialog, save the item and review the saved list. This sequence exercises relationships among controls that isolated component checks can miss. Record the starting state and the expected location of focus after each significant transition.
02
Change the viewing conditions
Review narrow width and enlarged text. Look for obscured controls, clipped focus rings and content that requires two-dimensional page scrolling without a meaningful reason. Confirm that text remains available when decorative imagery is absent. Automated scans can complement this work, but they do not establish the usability of the whole journey.
03
Write bounded findings
Record what was tested, which browser and assistive tools were used, and what remains untested. “No issues found by this scan” is narrower than “fully accessible.” Use precise evidence so the next reviewer can continue the work rather than relying on an unsupported completion claim.
03 / MAKE SOMETHING
Your guided lab
Finish the reading-list capstone and review the complete search-to-save journey.
Complete the journey using keyboard only, recording focus after each transition.
Repeat with enlarged text and a narrow viewport.
Combine any automated findings with manual observations and prioritize concrete repairs.
What to produce
A working flow, an accessibility review record and a list of remaining coverage limits.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The finished flow uses meaningful controls, visible focus, understandable dialog behavior and concise feedback. It preserves the reading task under the tested viewing conditions. The report distinguishes defects fixed from checks that passed and tools not used. A focused review is valuable without claiming universal conformance. If a screen-reader review was not performed, say so and leave a clear next step instead of implying that keyboard testing covers every assistive experience.
If something is not working
The report says only “accessible”
Replace the broad label with specific tested behaviors and explicit coverage limits.
A scan passes but the journey fails
Treat the observed journey failure as a real defect and inspect the interaction logic.
Take it one step further
An automated checker reports zero violations. Can the project skip its keyboard and dialog review?
Reveal the reasoning
No. The scan covers only rules it can evaluate. Focus order, task continuity, understandable feedback and many interaction details require additional review. Use the scan as one source of evidence, not the complete verdict.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
An automated scan passes. What can you conclude?
Every user can complete every task
The scan found no issues in the rules it checked
The interface is certified
Reference answer
B. The result covers the tool’s rules and current state; manual journeys remain necessary.
Capstone project
Build a reading-list page with search, a save action and an item-details dialog. Use native controls, visible focus, a result-status message and a recoverable form error. Document keyboard and zoom checks; this is a focused review, not a claim of full accessibility conformance.
Build the semantic page before adding decoration.
Add the dialog and test entering, escaping and returning focus.
Review search feedback, validation and zoom; document unresolved issues.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Use landmarks, labels and a logical heading sequenceEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Complete the flow with keyboard aloneEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep focus visible and restore it when the dialog closesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Announce meaningful updates without repeating the full pageEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Preserve content and controls at 200% zoomEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Choose honest visual encodings, show uncertainty, and turn a small dataset into a useful decision page.
For: Product designers building dashboards and reports. Before you begin: Basic percentages and confidence reading a small table. Use a design tool or HTML/CSS. Your outcome: A workshop attendance dashboard with a clear question, trustworthy scales and an accessible data table.
16 min reading · 120 min labs · 120 min project. Planning estimates.
Course map
Question and encoding — Match a chart to a decision and preserve the meaning of the data.
Context and communication — Show uncertainty and deliver a readable, accessible decision page.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Write the question above the chart
A dashboard becomes useful when the reader knows which comparison matters.
Define the decision
Start with who will act, what they can change and the time window. List the measures needed for that decision. More metrics are not automatically more context; unrelated figures compete for attention. Keep the data’s unit explicit so a large number is not mistaken for a good outcome.
Worked example
The organizer asks which workshop needs an attendance follow-up. Fictional data: Print has 18 attendees from 20 bookings; Clay has 12 from 30; Light has 8 from 10. Counts alone rank Print highest, but rates reveal Clay at 40% compared with Print at 90% and Light at 80%. The organizer needs both capacity context and the attendance denominator.
Practice
Create a three-row table with workshop, bookings, attendees and rate. Write one sentence explaining the decision. Sketch a layout that makes the rate comparison visible while retaining the counts. Label these as fictional teaching data rather than real business results.
Common mistake
A chart titled “Performance” hides the meaning of its measure. “Attendance among booked places, week 1” gives the reader a denominator and a period before they interpret the values.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
State the decision
The fictional workshop organizer wants to know which sessions used their booked capacity effectively. The supplied data are Print: 18 attendees from 20 booked places; Clay: 12 from 30; Light: 8 from 10. Raw attendance answers which session had more people. Attendance rate answers a different question about use of booked places.
02
Calculate transparently
Divide attendees by booked places: Print 90%, Clay 40%, Light 80%. Keep the original counts available beside the rates. A 90% rate based on 20 places and an 80% rate based on 10 places should not be presented as if the underlying observations were identical in scale.
03
Separate observation from explanation
Clay’s rate is lower in this small sample. The data do not establish why. Timing, cancellations, recording errors or differences in audience could matter. The display can identify a session worth investigating without claiming that its instructor or topic caused the result.
03 / MAKE SOMETHING
Your guided lab
Create a small decision page using the three supplied workshop records.
Write the question above the proposed chart before choosing its shape.
Calculate rates and retain the original numerator and denominator.
Write one supported observation and one explanation the data cannot establish.
What to produce
A question-led display specification and a transparent calculation table.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful headline is “How much booked capacity became attendance?” The table includes session, attendees, booked places and rate. The finding can say that Clay has the lowest observed rate at 40%, while avoiding a causal claim. The next step might be checking cancellation records or how bookings were counted. The chart should make the intended comparison easy, but the underlying arithmetic and scope must remain available for inspection.
If something is not working
The chart title says only “Performance”
Name the actual quantity and comparison so the reader knows what conclusion is supported.
A rate is shown without its base
Include counts or a nearby table to preserve scale and interpretability.
Take it one step further
Light has fewer attendees than Clay but a higher attendance rate. Is one of the results wrong?
Reveal the reasoning
No. They answer different questions. Light has 8 attendees versus Clay’s 12, but 8/10 is a larger proportion than 12/30. The decision determines which measure should lead, and the display should make the distinction explicit.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Clay has 12 attendees and 30 bookings. What attendance rate should be shown?
12%
40%
60%
Reference answer
B. Attendance rate is attendees divided by bookings: 12 ÷ 30 = 0.4.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Choose an encoding that preserves comparison
Position and length are usually easier to compare than decorative area or perspective.
Match form to task
Use aligned bars for category comparisons and lines for ordered change over time. Keep bar baselines at zero when length encodes magnitude. A line chart can use a narrower range if the axis is explicit and the context justifies it. Avoid decorative three-dimensional depth that changes apparent sizes without adding information.
Worked example
Three horizontal bars show attendance rates of 90%, 40% and 80% on a shared 0–100% scale. Direct labels provide the exact rates and counts. Sorting by rate helps identify Clay quickly; alphabetical ordering may be better if readers repeatedly locate known workshops. Choose the order based on the task and keep it stable during comparison.
Practice
Draw the same data as bars and circles with area encoding. Ask which makes the difference between 80% and 90% easier to judge. Keep the useful chart and write down why. Add a label that still works when colors are removed.
Common mistake
Starting a bar axis at 35% makes a 40% bar look nearly empty compared with 90%. The visual length then exaggerates the difference. A clear scale is part of the message, not an optional technical detail.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Match the task to the mark
To compare three rates, aligned bars on a common scale are easy to read. A set of decorative circles may look attractive but asks the reader to compare area rather than a simple aligned length. Choose the encoding for the question before choosing a visual style.
02
Keep the scale interpretable
When bar length encodes a rate, begin the length scale at zero so the visible proportions correspond to the quantities. A truncated baseline can make a modest difference appear much larger. Label the unit and keep the same scale across comparable panels.
03
Use emphasis sparingly
Highlight Clay if it is the investigation target, while keeping Print and Light readable as context. Do not use three equally vivid accents unless category identity itself matters. Direct labels can reduce the need to shuttle between a legend and the marks. The table remains a useful alternate representation.
03 / MAKE SOMETHING
Your guided lab
Draw two candidate displays of the three attendance rates, then choose the more trustworthy comparison.
Create aligned bars with a labeled 0–100% scale and direct values.
Compare them with a deliberately flawed truncated-scale version.
Explain the distortion and refine the selected chart’s emphasis and labels.
What to produce
A final chart, source table and an annotated explanation of the rejected encoding.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The correct version shows 90%, 40% and 80% against the same baseline and preserves the underlying counts nearby. Clay can be emphasized because the accompanying question concerns its lower observed rate, but the other bars should remain visible enough to establish context. The rejected version should explain how truncation changes the apparent magnitude, not merely call the chart dishonest. Good critique identifies the mechanism of distortion.
If something is not working
Color carries the only distinction
Add labels, position or another non-color cue so the comparison remains available.
Different panels use different scales
Make the difference explicit or use a common scale when direct comparison is intended.
Take it one step further
The bars look less dramatic with a zero baseline. Is that a reason to crop the scale?
Reveal the reasoning
No. The visual should represent the difference accurately. If a small difference matters operationally, explain its consequence in text or use a clearly labeled alternative encoding rather than exaggerating bar lengths.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What baseline should aligned rate bars use?
Zero, when bar length encodes the rate
The smallest observed value by default
A hidden baseline
Reference answer
A. A zero baseline keeps length proportional to the encoded value.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Keep missing data visible
A blank measurement and a measured zero describe different events.
Audit before styling
Check units, time windows, duplicate rows and denominators. Represent missing observations explicitly. When a denominator is zero, a percentage is undefined rather than 0%. If a value is estimated, label that fact close to the chart. Do not interpolate a missing point merely because a continuous line looks better.
Worked example
Clay’s week-two attendance is missing because the count was not recorded. Its bookings are known, but that does not justify a zero attendance rate. Show a gap and “Not recorded.” For a canceled Light session with zero bookings, show “No session” rather than a percentage. These choices prevent the organizer from investigating an invented collapse.
Practice
Add one missing row and one canceled session to the four-week dataset. Define the text, chart mark and table value for each. Check that a reader can distinguish all three cases: zero attendees, no session and unknown attendance.
Common mistake
A smooth trend line can imply more precision than the collection process supports. Show the observations first and explain any transformation, including how you aggregate weeks with different booking counts.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Distinguish three cases
A session with 0 attendees from 10 bookings has a rate of 0%. A session with 0 booked places has no defined attendance rate under this formula. A session whose attendance count was not recorded has missing data. Displaying all three as zero would erase important differences in what is known.
02
Choose explicit states
Use a dash or a phrase such as Not recorded for missing values, with a clear explanation. For a zero denominator, say No booked places rather than dividing blindly. Keep these cases in the table even if they cannot be represented by an ordinary rate bar. Absence from the chart should not look like absence from the dataset.
03
Check aggregation
If combining sessions, sum compatible attendee and booking counts before calculating the overall rate. Averaging session percentages gives each session equal weight, which answers a different question. State which summary you intend and retain enough source detail for the reader to verify it.
03 / MAKE SOMETHING
Your guided lab
Extend the dataset with Studio: 0/10, Field: 0/0 and Archive: attendance not recorded, 15 bookings.
Assign a distinct display state to zero, undefined and missing values.
Calculate the combined rate only for records with valid compatible counts.
Explain which records were excluded and why, without silently dropping them.
What to produce
A revised chart/table and a short missing-data policy.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Studio is a valid 0% observation. Field has an undefined rate because its denominator is zero. Archive cannot provide a rate because attendance is missing. The original three valid sessions combine to 38 attendees from 60 booked places, about 63.3%; adding Studio gives 38/70, about 54.3%. Neither equals an unweighted average of the session percentages. State the inclusion rule so the reader knows what the summary covers.
If something is not working
A blank bar is interpreted as zero
Label missing or undefined states directly and preserve their rows.
The total rate seems inconsistent
Recalculate from summed compatible counts and inspect which records were included.
Take it one step further
A missing attendance value is replaced with zero to keep the chart tidy. What is lost?
Reveal the reasoning
The distinction between “nobody attended” and “we do not know attendance.” That change can alter both the session interpretation and the aggregate. Visual tidiness is not a reason to manufacture a measurement.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A session has zero bookings and zero attendees. What is its attendance percentage?
0%
100%
Undefined; explain that no booked places existed
Reference answer
C. Division by zero does not produce a meaningful attendance rate.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Deliver the decision and its limits
A good data story helps the reader act without claiming more than the observations support.
Layer the information
Put the question and principal observation first, then the comparison, supporting table and methodological notes. Write a chart summary that names the pattern in words. Interactive tooltips can add detail, but essential values must remain available to keyboard and touch users. Provide a table for precise inspection.
Worked example
The page says “Clay needs follow-up: 12 of 30 booked places attended in week 1.” It does not say the instructor caused low attendance. A note proposes checking reminder delivery and cancellations before changing the programme. The chart supports where to investigate; it does not establish the cause.
Capstone practice
Build the attendance review with the supplied fictional values and your missing-data cases. Include a plain-language summary and table. Test at 390px: the question, critical comparison and units should remain visible without a hover action. Ask a peer what decision the page supports and what remains unknown.
Review criterion
Every prominent statement should trace to a displayed value or be labeled a hypothesis. Remove a chart if it adds no new evidence to the decision.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Write the supported conclusion
The page can identify Clay’s lower observed rate and recommend investigating its booking-to-attendance journey. It cannot identify a cause from this table alone. Place the conclusion near the chart and make its scope explicit: this fictional set of sessions, these counts and this calculation.
02
Provide the audit trail
Include the source table, rate formula, missing-data treatment and any aggregation rule. If values are illustrative, label them as such. A reader should not have to infer whether the chart reflects live operational data, a selected sample or a teaching fixture.
03
Review without the visual
Read the page’s headings, conclusion and table in a linear order. The essential comparison should remain understandable without color or the chart image. Test narrow layout so labels and counts do not disappear or become disconnected. A visual summary and a usable table support different inspection tasks.
03 / MAKE SOMETHING
Your guided lab
Finish the workshop attendance dashboard and write a decision note for the organizer.
Present the question, chart, counts and bounded interpretation together.
Document missing values, zero denominators and the aggregate calculation.
Review keyboard access, narrow layout and a text-only reading of the main finding.
What to produce
A complete decision page and a short note explaining the recommended investigation and its limits.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The final page makes the low observed rate visible, preserves the data needed to check it and names a next question rather than inventing a cause. It should state that the records are a fictional teaching dataset. The table has meaningful headers and the main conclusion does not depend on color. The capstone succeeds when another person can explain both the supported observation and the important uncertainty, then identify what evidence would be useful next.
If something is not working
The conclusion is more certain than the data
Separate observed comparison, possible explanation and proposed next investigation.
The chart works only at desktop width
Recompose labels and table access without removing the quantities that explain the result.
Take it one step further
The organizer wants to cancel Clay immediately because its rate is lowest. What should the dashboard author clarify?
Reveal the reasoning
The table flags a pattern in a limited dataset; it does not establish cause or the full value of the workshop. Explain the missing context and propose a proportionate investigation before treating the visual comparison as a complete business decision.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Low attendance is observed. Which conclusion is supported?
The instructor caused it
This session warrants investigation
The workshop should be permanently canceled
Reference answer
B. The rate identifies a question; additional evidence is needed to explain the cause.
Capstone project
Design an attendance review for three workshops over four weeks using the fictional lesson data. Help an organizer decide which session needs investigation. Include counts, rates, a clear denominator, missing-data treatment and a text/table alternative.
Define the question and audit the supplied rows.
Sketch two encodings and compare the decisions each supports.
Build the final page with annotations, table and limitations.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
State the organizer’s decision and the date rangeEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Show counts and denominators beside ratesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use chart scales that preserve comparisonsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Distinguish missing, zero and estimated valuesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Include an accessible table and a cautious recommendationEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Build a reusable story card that responds to its own space, survives difficult content and works in more than one layout.
For: Developers who already use Grid and media queries. Before you begin: HTML, CSS Grid and media queries. Use a modern browser with container-query support. Your outcome: A container-aware card system tested in a sidebar, grid and full-width feature.
17 min reading · 120 min labs · 120 min project. Planning estimates.
Course map
Intrinsic foundations — Make a component resilient before adding a breakpoint.
Container-aware composition — Separate page decisions from local layout and test reuse.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Let content reveal the breakpoint
A component’s narrow state should work before you decide when it can become wider.
Begin with flow
Use a natural document order: image, title, description and action. Let blocks grow with their content. Grid children sometimes need min-width: 0 so long content can shrink within the track. Use overflow-wrap for genuinely unbroken strings rather than truncating meaningful titles.
Worked example
A story card fits in a 280px sidebar until the title becomes “An unexpectedly long afternoon in the city.” A fixed 42px heading height clips it. Removing the fixed height solves the content problem without a new breakpoint. The action follows the description naturally, and the card grows; equal-height catalogue alignment can be handled by the parent grid.
Practice
Create the narrow card with a short title, a five-line title and an absent image. Test each in the same 280px container. Record which rules prevent overflow and which merely hide it. Keep the reading order understandable without CSS.
Common mistake
Adding a media query for every awkward word treats symptoms as device sizes. First fix the sizing contract; introduce a breakpoint when a different arrangement becomes more useful.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Set a demanding specimen
Use a story card containing a landscape image, a 70-character title, a category, a two-line description and a Save button. Put it inside a resizable wrapper. Begin wide and narrow the wrapper slowly; the first failure may be an unreadable text column, not a familiar device width.
02
Name the failure
At 310px, a side-by-side image may leave only 140px for the title. The problem is the relationship between media and text. Changing the entire page at 768px would hide this failure in some placements while leaving it in others. Record the width of the card’s container when the reading task becomes uncomfortable.
03
Choose the simpler arrangement
Stack media above text below the observed threshold. Preserve document order and allow the card to grow vertically. Repeat with a short title and no image so the breakpoint serves the range of supported content rather than a single attractive specimen.
03 / MAKE SOMETHING
Your guided lab
Investigate a story card in wrappers from 240px to 700px.
Capture the first visible content failure and its container width.
Create a stacked arrangement and compare the transition on both sides of your threshold.
Replace the title and remove the image; check that the action remains reachable.
What to produce
A breakpoint rationale with three content variants and narrow/wide captures.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A reasonable result switches to stacking when the text column becomes too narrow for useful reading. The exact threshold depends on this card’s typography and media ratio. Record that dependency rather than calling the number universal. Keep the Save button in normal flow, permit multi-line titles and reserve a stable media ratio. The missing-image variant should remove or intentionally replace the media area without leaving a meaningless empty rectangle.
If something is not working
The breakpoint follows a device list
Resize the component itself and identify an actual failure.
A long title overlaps the action
Remove fixed text heights and inspect minimum-size constraints.
Take it one step further
The same card breaks in a desktop sidebar but works on a phone. Which width matters?
Reveal the reasoning
The space allocated to the card matters. A wide viewport can contain a narrow sidebar. Component layout decisions should respond to the containing region while page-level navigation can still respond to the viewport.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A long title is clipped by a fixed card heading height. What is the first fix?
Add five viewport breakpoints
Allow the heading to size from its content
Hide the final words
Reference answer
B. The content constraint is wrong; a new breakpoint would only mask it.
LESSON 2 / 5 min read / 30 MIN PRACTICE
Query the space the card actually gets
A wide browser can still contain a narrow sidebar. Local layout needs local information.
Establish the container
Set container-type: inline-size on a wrapper and give it a name when the page has several candidates. Descendants can query that wrapper’s inline size. The query styles a descendant, not the queried container itself. Keep the wrapper in normal layout with a sensible width supplied by its parent.
Worked example
The story-card wrapper receives its width from either a sidebar or a grid track. Below 30rem the card remains stacked. Above that available width, the image and text become two columns. Moving the same component between parents changes its layout without changing the browser width or passing a “sidebar” class through the application.
Practice
Place two copies on a wide page, one in a 260px column and one in the remaining space. Resize the parent tracks while leaving the viewport unchanged. Confirm that only the wide card changes arrangement. Inspect which ancestor provides the query context when a nested container is added.
Common mistake
A query can silently bind to an unintended ancestor. Naming the container helps express which space the component is responding to, and a useful base layout protects readability if an enhancement is unavailable.
Wrap the card in a named container and apply container-type: inline-size there. This allows descendants to query its inline size. The element being restyled must be inside the query container; a card cannot use its own query to restyle itself based on itself.
02
Keep a usable base
Write the stacked card as ordinary CSS first. Then add the wider arrangement inside the query. A browser without the enhancement still receives a coherent card. Use minmax(0, 1fr) for the text track where long content would otherwise force the grid wider than its allocation.
03
Compare simultaneous placements
Place two instances on the same page, one in a narrow sidebar and one in a wide article area. They should adopt different layouts at the same viewport width. This comparison distinguishes genuine container behavior from a viewport query that happens to look correct once.
Implement a named story container and show narrow and wide instances together.
Start with stacked markup and styles that work without any query.
Add inline-size containment to the wrapper and a named query for the wide layout.
Resize each wrapper independently and test an unbroken title string.
What to produce
A live page with two independently responsive instances of the same card.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Both instances use identical card markup and one component stylesheet. The narrow wrapper stays stacked while the wide wrapper uses two columns. The wrapper owns containment; the card inside owns its arrangement. Text can shrink because the grid track and text item permit it. A long URL wraps deliberately. Removing the query block leaves a functional stacked baseline, which is useful evidence that the enhancement is not carrying the content’s basic accessibility.
If something is not working
The query never matches
Confirm that the named container is an ancestor and its name matches the query.
The card still overflows
Check intrinsic minimum widths and unbroken content before changing the breakpoint.
Take it one step further
Why place containment on a wrapper instead of using a query to change that wrapper’s own columns?
Reveal the reasoning
Container queries style descendants according to an ancestor container. Keeping the measurable boundary separate from the card also clarifies who allocates space and who adapts to that space.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What does the named query measure?
The browser window in every case
The matching ancestor query container
The queried element’s own width
Reference answer
B. The component responds to the named ancestor’s available inline size.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Separate page rules from component rules
The parent decides where a component lives; the component decides how its content fits.
Keep responsibility local
Use viewport queries for page-level decisions such as navigation layout. Use container queries for a card’s internal arrangement. Avoid allowing the child to demand an arbitrary page width. Treat decorative crop, text measure and action alignment as internal choices, while the parent controls track count and gaps between cards.
Worked example
A catalogue switches from one to three columns as the page gains space. Its cards still decide whether image and text can sit beside one another. On a very wide grid, a three-column page may give each card less space than a two-column page. A viewport-only rule would incorrectly assume every card is wide.
Practice
Build three placements for your card. Change the catalogue from two columns to three without editing card CSS. If the component breaks, identify a rule that assumed its surroundings. Add an image with a different aspect ratio and decide whether to crop or preserve it based on the story’s content.
Common mistake
Visual reordering can make keyboard and reading order disagree. Prefer a source order that works in every layout, and use grid placement for modest composition changes rather than rearranging the meaning.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Assign ownership
The page decides whether it has a sidebar, how many columns its collection needs and how much space surrounds the collection. The card decides its internal media/text arrangement, spacing and action states. If a card stylesheet targets a specific page ID, the boundary probably needs review.
02
Use a small contract
Allow content, an optional image and a meaningful action. Support one deliberate compact treatment only if it solves a documented use case. Avoid parameters for every margin and font size; these let consumers dismantle the hierarchy while still claiming to use the shared component.
03
Inspect the cascade
Move the card into a plain document. If its heading loses all styling, it was relying on unrelated page selectors. Conversely, a global h2 rule inside the component stylesheet may accidentally restyle the host page. Scope styles to the component without making selectors unnecessarily difficult to override.
03 / MAKE SOMETHING
Your guided lab
Move your card between a magazine grid, an article sidebar and a saved-items list.
List which rules belong to the host and which belong to the card.
Remove page-specific selectors from the component.
Write a short supported-content contract and reject one unnecessary variation.
What to produce
One component stylesheet and three small host layouts with documented responsibilities.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The magazine controls its collection grid, the sidebar controls its allocation and the saved list controls its item spacing. Every host passes the same content shape to the card. The card’s named container reacts to available space without reading a page-specific class. A useful variation might omit an unavailable image; a less useful variation would expose arbitrary title coordinates. The contract should preserve structure while allowing legitimate content differences.
If something is not working
Every host needs a CSS patch
Inspect whether page assumptions leaked into the component.
The component changes unrelated headings
Scope its selectors and review inheritance deliberately.
Take it one step further
A host wants a larger gap between cards. Should the card’s internal padding change?
Reveal the reasoning
No. Collection spacing belongs to the host, while padding separates content inside each card. Keeping those responsibilities distinct prevents a layout request from silently altering every card’s internal hierarchy.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which decision belongs to the parent catalogue?
How many card tracks fit on the page
The card title’s semantic heading
The card’s internal image-to-text ratio
Reference answer
A. Track count is a page arrangement; the card should remain reusable inside each track.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Prove the component travels
A reusable component needs evidence from more than its original screenshot.
Build a stress matrix
Use widths around the actual transition, not only familiar phone and desktop presets. Include long text, missing media, browser zoom and translated labels. Check that the action remains reachable and that focus is not clipped by an overflow rule. Preserve a readable base presentation before applying enhancements.
Worked example
The card looks correct at 390px and 1280px but overflows at a 479px container width because a long action label cannot shrink. Allowing the label to wrap and removing a fixed minimum width fixes the boundary. This is a component defect that the two common viewport screenshots would have missed.
Capstone practice
Deliver the three placements and a short matrix of tested widths and content. Capture one failed boundary case and the change that fixed it. Use the project checklist to review semantic order, missing media and keyboard access.
Review criterion
Another developer should be able to insert the wrapper into a new grid without knowing your original page dimensions. Document the minimum viable width and any genuine content limits.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Build a compact matrix
Use three placements, two title lengths and image present/absent. Add keyboard focus and enlarged text as separate checks. This produces useful coverage without generating dozens of screenshots that nobody can interpret. Label each captured state with its placement and content variant.
02
Test the action, not only the box
Tab to Save, activate it and observe the label and state. If removing a saved item removes the focused card, decide where focus should move. Responsive quality includes action continuity and reading order, not just the absence of horizontal scrolling.
03
Write the limits
Record tested widths, content assumptions and browser environments. A passing local specimen does not establish compatibility everywhere. If an image crop can remove an essential subject, document the content guidance or provide an intentional focal-position option rather than silently accepting misleading crops.
03 / MAKE SOMETHING
Your guided lab
Finish the three-placement card and review it using your matrix.
Run long-title and missing-image cases in every placement.
Check keyboard operation and enlarged text in the narrowest host.
Record one defect, the correction and the repeated check that confirms it.
What to produce
A reusable card, a labeled specimen page and an evidence-based handoff note.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The handoff includes the content API, containment wrapper, host examples and failure matrix. A useful defect record might show that a fixed action row clipped at larger text sizes, followed by a normal-flow repair and a repeat capture. Do not declare the component universally responsive. State the tested range and legitimate content boundaries so the next implementer knows which assumptions to preserve and which new cases require another review.
If something is not working
The report says only “looks good”
Name the input, action and observable result for each important check.
The demo works only with mouse hover
Inspect default and focus-visible states separately.
Take it one step further
A screenshot proves no overflow at 320px. Does it establish keyboard usability?
Reveal the reasoning
No. Overflow and keyboard behavior are different claims. Operate the controls, inspect focus visibility and confirm the result of activation before recording keyboard support.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which extra test is most likely to expose a breakpoint defect?
Only the largest monitor
Widths just below and above the transition
A second screenshot at the same width
Reference answer
B. Boundary values reveal assumptions hidden by comfortable example sizes.
Capstone project
Build a story card once and place it in three containers: a narrow sidebar, a two-column catalogue and a wide feature. Use real long titles, optional media and a visible action. Document which decisions depend on the viewport and which depend on the card’s available width.
Build a readable single-column card with no queries.
Add a wide composition triggered by its containing space.
Test three placements, long content, zoom and missing media.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Declare a named inline-size query containerEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Change internal layout using available container spaceEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Preserve content with long titles and absent mediaEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep semantic order and visible focus across layoutsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Provide a useful base layout before container-query enhancementsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Build a booking form that preserves input, explains errors and handles pending or failed submissions truthfully.
For: Frontend developers building real data-entry flows. Before you begin: HTML controls, JavaScript events and promises. Your outcome: A validated workshop form with a clear state model and a recoverable simulated submission.
16 min reading · 120 min labs · 120 min project. Planning estimates.
Course map
Input and validation — Make requirements visible and errors repairable.
Submission and recovery — Model asynchronous outcomes without losing the user’s work.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Make the requirement visible before the error
A form is easier to complete when the field explains what it needs before rejecting an answer.
Use the platform
Choose suitable input types, labels, autocomplete tokens and required constraints. Place examples and hints before submission, especially when a format is unfamiliar. Placeholder text is not a persistent label. Native validation offers a useful baseline, but its messages and timing still need review in your intended browsers.
Worked example
The reservation form labels an email field “Email for your reservation” and uses type="email" with autocomplete="email". The name field accepts ordinary punctuation and spaces rather than an overly restrictive letters-only expression. A session select has a clear unselected option. These choices reduce preventable errors before any custom JavaScript runs.
Practice
Build the three fields without custom validation. Tab through them, submit with missing values and use a valid address containing a plus sign. Record where the browser’s behavior is helpful and where your task needs additional explanation.
Common mistake
An elaborate regular expression can reject valid names and addresses. Validate the minimum structure needed by the task and leave domain-specific acceptance to the appropriate service. Client validation alone is never a trusted server boundary.
<label for="booking-email">Email for your reservation</label>
<input id="booking-email" name="email" type="email"
autocomplete="email" required>
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Begin with the decision
The fictional workshop form asks for a name, email and session. Explain what the email is used for and whether submission reserves anything. In this local exercise it only simulates a request. A clear form states that limitation before the primary action, not after an apparent confirmation.
02
Attach guidance to fields
Use visible labels, appropriate input types and native required constraints. Place format guidance near the email field and associate help text when needed. A placeholder disappears while typing and cannot carry the only label. Avoid demanding information that the exercise never uses.
03
Separate errors from requirements
“Choose a session” is a requirement before submission and can become an actionable error if omitted. A vague red border supplies neither the problem nor its repair. Use a text message, preserve the entered value and let the person correct the specific field.
03 / MAKE SOMETHING
Your guided lab
Design the first state of a simulated workshop request form.
Write labels, required indicators and the local-demo explanation.
Choose native controls and associate their help text.
Attempt submission with every field empty and inspect the guidance.
What to produce
An accessible form with a truthful action label and a field requirements table.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Use a text input for name, an email input for email and a select or radio group for the session. “Simulate request” is truthful for this exercise. Keep the explanation near that action. Each required field has a visible label and understandable recovery message. Do not add a phone number merely to make the form feel substantial. The best initial state makes completion easier and prevents uncertainty before validation has to intervene.
If something is not working
The field is identified only by placeholder
Add a persistent label associated with the control.
Success implies a real reservation
Revise the action and confirmation to describe the simulation.
Take it one step further
Should a required email error appear immediately when the empty form opens?
Reveal the reasoning
Usually not. Explain the requirement first and validate when the person has had a reasonable opportunity to complete the field or tries to submit. Immediate blame for an untouched field adds noise.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Where should the field’s purpose be written?
Only inside a disappearing placeholder
In a visible label associated with the control
Only after submission fails
Reference answer
B. The label remains available while the person enters and reviews a value.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Validate at the moment someone can act
Feedback is useful when it helps repair an answer instead of interrupting the act of typing it.
Choose timing deliberately
Do not show an error merely because a newly focused field is empty. Validate on submission and, where helpful, revalidate a field after it has already failed. Keep the message next to the control and connect it with aria-describedby. Use aria-invalid only while the value is invalid, and remove stale error text after correction.
Worked example
A person types the first characters of an email address. The form waits rather than repeatedly announcing an incomplete address. On submission, it identifies the email field and preserves the name and chosen session. Once the address is corrected, the error state clears; the form does not require a full page reload.
Practice
Add one custom rule: the chosen session must still be present in the available-session list. Simulate its removal before submission. Show the problem beside the select and offer another choice. Keep the previous user-entered values in the other fields.
Common mistake
Color alone cannot explain which value failed or how to fix it. Pair the visual treatment with a specific message and ensure the focus indicator remains distinct from the error border.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Distinguish incomplete from invalid
While someone types “lee@”, the address is incomplete but still in progress. Announcing an error on every keystroke can interrupt that work. Start with submission validation or a considered blur policy, then clear or update an existing error when the field becomes valid.
02
Preserve a consistent rule
Use the same requirement at the field and submission boundary. Client validation improves feedback but does not replace server validation in a real service. This project uses a deterministic local adapter; label its responses as simulated and keep the validation rules visible in the exercise.
03
Direct attention carefully
On submission, an error summary can identify all failing fields and link to them. Inline messages explain specific repairs. Keep messages near their fields and avoid moving focus repeatedly while the person types. A single submission should create one understandable recovery route.
03 / MAKE SOMETHING
Your guided lab
Implement missing-session and malformed-email cases without erasing input.
Define when each message first appears and when it clears.
Submit invalid values, follow the summary to a field and repair it.
Try a valid address after a failure and ensure stale feedback disappears.
What to produce
A validation timing table and a form that follows it.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
For this small form, validate on submit, then recheck a field with a visible error as it changes. Preserve all other values. An error summary says which fields need attention, and each message tells the person what to do. Correcting email removes the email error without pretending the missing session is fixed. A production handoff would also describe how authoritative server errors map back to fields; the local exercise cannot establish that integration.
If something is not working
An error survives a successful correction
Re-evaluate the field using the same validation rule and clear its stale message.
Focus jumps on every keystroke
Reserve focus movement for deliberate navigation or submission recovery.
Take it one step further
A client accepts an address but a real server rejects it. Which result should the interface respect?
Reveal the reasoning
The server response is authoritative for the submitted operation. Present its actionable explanation while preserving input. Client checks are an early convenience, not proof that a remote request will be accepted.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
When a previously invalid value becomes valid, what should happen?
Keep the old error until reload
Clear the invalid state and obsolete message
Erase the entire form
Reference answer
B. Feedback should describe the current value, not a past failure.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Model submission as a state machine
A request being sent is not the same as a reservation being confirmed.
Name the states
Use idle, submitting, success and error. A transition to submitting should prevent duplicate attempts while preserving the values on screen. Only confirmed success should produce success copy. A network failure returns the form to a retryable state. On a real service, an idempotency mechanism is also needed to handle uncertain or repeated requests safely.
Worked example
The local simulation waits one second, then either returns a reservation object or throws. While pending, the button says “Checking reservation…” and cannot start another request. On failure, the form explains that the check did not finish and offers Try again. It does not invent a reservation number to make the flow look complete.
Practice
Write the four-state transition table before implementing it. Test double-clicking, a rejected promise and success after a retry. Log the number of handler calls so duplicate prevention is observable. Label the simulation clearly because it does not reserve a real seat.
Common mistake
Disabling the button forever after an error protects against duplicates by removing recovery. Restore a usable state after failure, and communicate whether the outcome is known or uncertain.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Name the states
Use idle, submitting, success and error. The submitting state owns a snapshot of the request, so changing an input later cannot rewrite the meaning of an in-flight attempt. The displayed confirmation should refer to that submitted snapshot rather than whatever happens to be in the controls now.
02
Define permitted transitions
Idle can submit after validation. Submitting can succeed or fail. Error can retry or return to editing. Prevent duplicate activation while one request is active, and restore an available action after failure. A spinner is only a visual expression of this model.
03
Keep the transport replaceable
Use a local function that deliberately resolves or rejects after a known delay. Pass the same payload shape a real adapter would accept, but do not suggest that a booking service exists. The deterministic adapter lets you practice failures that are difficult to reproduce with an unreliable live connection.
03 / MAKE SOMETHING
Your guided lab
Build a local submission adapter with selectable success and failure outcomes.
Write the transition table and the payload fields.
Capture values at submit and block duplicate in-flight attempts.
Display a truthful local confirmation or a retryable error from the captured attempt.
What to produce
A four-state submission flow with repeatable success and failure scenarios.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The state object can hold status, submitted values and an error message. On submit, validate, capture a fresh payload and enter submitting before awaiting the adapter. Only that attempt may settle the state. Success says the local simulation completed; failure preserves the values and restores Retry. If editing during submission is permitted, visually distinguish the current draft from the submitted snapshot. Disabling editing during this small exercise is also valid if clearly communicated.
If something is not working
Two quick activations create two requests
Guard the transition in the handler as well as expressing pending state visually.
The confirmation names a newly edited session
Render from the submitted payload, not mutable form controls.
Take it one step further
Is disabling the button enough to define a robust submission model?
Reveal the reasoning
No. The handler and state transitions must also reject duplicate in-flight operations. The visual disabled state helps communicate the rule, but the model owns it.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
The request failed before confirmation. Which message is accurate?
Your place is confirmed
We could not finish the request; your details are still here
Your session was canceled
Reference answer
B. The failure does not establish a booking or a cancellation.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Test the uncomfortable paths
A form earns trust when a mistake or slow connection does not destroy the work already entered.
Create a journey matrix
Test empty submission, malformed input, unavailable session, slow completion, failure and retry. Use the keyboard and a narrow viewport. Ensure feedback does not move the page unexpectedly or hide the input beneath a fixed header. Inspect the actual submitted values, including unchecked or disabled controls.
Worked example
A disabled session select is omitted from FormData. The mock request therefore lacks the selected session even though the screen displays it. Keep essential data in your state model or build the payload deliberately before disabling controls. The visible interface and submitted payload must agree.
Capstone practice
Finish the form and add a development-only switch for success, slow and failure scenarios. Document each expected outcome and compare it with the actual UI. Include one screenshot of recovery after an error, with the earlier name and email still present.
Review criterion
A peer should be able to make a mistake, understand it, correct it and reach the local success state without re-entering unrelated information. Keep the simulated nature of the result visible.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Write the awkward scenarios
Test empty submission, invalid email, a slow success, a deterministic failure, a retry and two rapid activations. Keep a counter in the local adapter to prove how many operations start. A smooth successful demonstration says little about these paths.
02
Treat unknown outcomes honestly
In a real booking service, a connection loss can occur after the server accepts a request. That outcome is uncertain, not automatically failed. Reliable retry may require a server-supported idempotency key or status lookup. Do not claim that a client-only demo guarantees exactly-once reservations.
03
Review the whole recovery
After failure, the inputs remain, the message identifies the problem and the next action is available. Check focus and announcement behavior with the chosen browser and assistive setup. Record exactly what was tested rather than using one keyboard pass as a claim of comprehensive accessibility.
03 / MAKE SOMETHING
Your guided lab
Complete the simulated workshop request and produce a recovery report.
Run the six awkward scenarios and record started-operation counts.
Verify that retry uses the intended payload and restores useful feedback.
Document the production requirements that the local adapter does not implement.
What to produce
A working simulation, scenario results and a clear boundary between local and production behavior.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A strong report shows one request for rapid double activation, preserved input after failure and a successful retry with the expected payload. The button becomes usable again, and the confirmation explicitly describes a simulation. The production note names authoritative validation, authentication if needed, durable storage and an idempotency strategy for uncertain responses. These are requirements to implement later, not capabilities established by this exercise.
If something is not working
Retry silently changes the session
Decide whether retry repeats the snapshot or submits an edited draft and label it accordingly.
An unknown outcome is called definitely failed
Represent uncertainty and specify how a real service would resolve status.
Take it one step further
A request times out after a server might have accepted it. Is blindly retrying always safe?
Reveal the reasoning
No. A repeated operation may create a duplicate. A real service needs an agreed retry/idempotency contract or a way to reconcile the outcome. The interface should not manufacture certainty from a timeout.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A disabled field contains a required payload value. What should you verify?
Only its visual appearance
That the request still includes the intended value
That the disabled control still has a visible label
Reference answer
B. Disabled controls are not automatically successful form controls; inspect the payload contract.
Capstone project
Build a workshop reservation form with name, email and session fields. Use a simulated asynchronous handler with success and failure modes. Preserve valid input on failure, prevent duplicate pending submission and clearly label the result as a local simulation.
Build and test native field semantics.
Add validation feedback and a simulated asynchronous handler.
Test retry, repeated clicks, keyboard use and slow completion.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Associate visible labels and hints with every controlEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Validate at a useful moment and identify the affected fieldsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Preserve input after a failed submissionEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Prevent duplicates while allowing a retry after failureEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Distinguish idle, submitting, success and error statesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Replace contradictory booleans with explicit states and make missing cases visible before the interface ships.
For: JavaScript developers learning to model interface data with TypeScript. Before you begin: JavaScript objects, functions and promises; basic TypeScript syntax. Your outcome: A typed resource-loading model with exhaustive rendering and validated external input.
17 min reading · 120 min labs · 150 min project. Planning estimates.
Course map
Model the domain — Use explicit variants to prevent contradictory states.
Protect the boundary — Keep type assertions from masquerading as runtime validation.
LESSON 1 / 5 min read / 30 MIN PRACTICE
Replace combinations with named states
Three independent booleans create combinations that your product may never intend to support.
Find the contradictions
Consider loading, hasError and hasData. If all three are true, which screen should appear? A discriminated union gives each meaningful state a name and its own required data. It does not eliminate design decisions; it forces you to make them explicit instead of hiding them in nested conditions.
Worked example
A resource is idle, loading, ready with books, or error with a message. The ready variant always contains the books array, including an empty one. Loading does not pretend to contain usable data. If you want stale data during refresh, add a deliberate refreshing variant rather than accidentally mixing flags.
Practice
Write the union below and create one value of each variant. Try to construct an error without a message and a ready value without books. Run your type checker and inspect the errors. Then decide whether empty success deserves a separate variant or can be derived from an empty array.
Common mistake
Optional properties on one broad object allow many incomplete combinations. A discriminant ties the available fields to the state in which they have meaning.
Three booleans named loading, failed and complete permit eight combinations, including loading and complete together. A reading-list loader only needs a few meaningful states. Write those states as alternatives so the type describes what the interface can actually mean.
02
Attach data to its state
The ready state carries validated books; error carries a message; loading may carry a request identifier. Avoid optional data everywhere because it asks every consumer to guess whether an undefined value is expected. A success state with an empty array is a valid empty result, not a loading state.
03
Model the transition boundary
The loader starts loading, validates a response and then creates success or error. The renderer consumes the resulting state. Types describe permitted shapes; they do not cause the transitions or validate network bytes automatically. Those remain implementation responsibilities.
Define the four states of a typed reading-list loader.
List the contradictory boolean combinations you want to eliminate.
Write a union with one literal status discriminator.
Create examples of each valid state and let the compiler reject an invalid ready value.
What to produce
A state union with valid fixtures and one documented compile-time rejection.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful union has idle, loading, ready with Book[] and error with a string message. Success with [] supports a genuine empty catalogue. A ready object without books should fail type checking. Keep the fixture that demonstrates the intended valid shape, and document the rejected example without suppressing it using any. This exercise proves a compile-time relationship; runtime data still needs a separate check before becoming Book[].
If something is not working
Every property remains optional
Move fields into the alternatives where they are required.
An assertion silences the invalid fixture
Remove the assertion and correct the model or the value.
Take it one step further
Does a union guarantee that a fetched JSON object matches its success payload?
Reveal the reasoning
No. TypeScript types do not validate external data at runtime. Treat the response as unknown, inspect its shape and construct a success state only after validation.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which model prevents ready-without-data?
Three unrelated booleans
A ready union variant with a required books field
An optional books field everywhere
Reference answer
B. The required field belongs specifically to the ready variant.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Let narrowing guide the renderer
Checking the discriminant tells both you and the compiler which fields are available.
Render one variant at a time
Use a switch or conditional that checks the shared discriminant. Inside the ready branch, access the data guaranteed by that variant. Avoid non-null assertions that silence a useful warning. Use an exhaustive final branch so adding a future state requires a presentation decision.
Worked example
The loading branch returns a progress message, ready returns the item count, and error returns its message. A never assignment in the default branch fails type checking if a new “refreshing” variant is added without updating the renderer. This connects the model’s evolution to the screens that must support it.
Practice
Add a refreshing variant with existing books. Run the type checker before changing the renderer. Use the resulting error to locate the missing behavior, then decide whether old content stays interactive during refresh. Write that decision alongside the model.
Common mistake
Casting every branch to the desired type defeats the model. An assertion tells the compiler to trust you; it does not prove that the value has the required shape.
function label(state: LoadState): string {
switch (state.status) {
case "idle": return "Choose a list";
case "loading": return "Loading";
case "ready": return `${state.books.length} books`;
case "error": return state.message;
default: { const missing: never = state; return missing; }
}
}
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Read the discriminator first
Switch on state.status; the discriminator for successful data is ready. Within the ready branch, TypeScript knows that books exists; within error, message exists. This reduces defensive conditions that hide a confused model. Render the empty result inside the ready branch by inspecting the array length.
02
Make new states visible to the compiler
An exhaustive check assigns the remaining value to never after all cases. If a new status is added without a rendering branch, the check should fail. This turns a forgotten UI state into a specific development signal rather than an undefined screen.
03
Keep rendering truthful
A loading branch names the operation, an error branch explains recovery and success presents validated data. Type safety cannot decide whether the copy is helpful or focus is preserved. Review those interaction responsibilities alongside the compiler’s structural guarantees.
03 / MAKE SOMETHING
Your guided lab
Implement a renderer for every loader state and add a temporary new state.
Write one branch per discriminator and handle empty success explicitly.
Add an exhaustive never check.
Temporarily add a cancelled alternative and observe the missing-branch error before implementing or removing it.
What to produce
An exhaustive state renderer and a short explanation of the compiler experiment.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The renderer produces a starting prompt, a loading status, a list or empty message, and an actionable error. Access to books happens only after ready narrowing. Adding cancelled should expose a missing case at the exhaustive boundary. If it does not, inspect whether a broad default return swallowed the state or any erased the type. Keep the final model aligned with actual product behavior rather than retaining a demonstration-only state.
If something is not working
A default branch hides every new state
Use an exhaustive check instead of silently returning an empty view.
Empty success is shown as an error
Separate a valid zero-item result from a failed operation.
Take it one step further
A renderer compiles but its error branch says “Done.” What has the type system established?
Reveal the reasoning
It has established structural access and coverage, not semantic truth. Copy, actions and user-visible meaning still require review and behavioral checks.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A new union variant is added. What should exhaustive rendering reveal?
Nothing until production
Every renderer missing that case
Only code that explicitly reads the new variant
Reference answer
B. An exhaustive branch turns an omitted state into a type-checking failure.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Treat outside data as unknown
A type annotation describes your expectation; a network response can still violate it.
Validate before promoting
Start external JSON as unknown and check the properties your application depends on. A validator can be handwritten for a small shape or provided by a schema library. Either way, it must execute at runtime. Keep a useful error path when the data is malformed instead of allowing a later render to fail mysteriously.
Worked example
The loader expects a book with string id and title. A response containing title: null is not a Book merely because the fetch call is followed by “as Book.” A small guard checks that the value is a non-null object and the required fields are strings. The application can then enter an error state with a truthful message.
Practice
Test a valid book, null, a number, an object with a numeric id and an object with missing title. Decide whether empty strings are permitted by your domain. Type structure and business rules are related but distinct checks; document both.
Common mistake
JSON parsing only proves syntactic validity. It does not prove that the object is suitable for your application. Place validation close to the boundary so the rest of the code can rely on a smaller set of assumptions.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Start at the boundary
JSON parsing establishes that bytes form a JSON value, not that the value is a book array. The response could be null, an object, an array of malformed items or a server error payload. Give it the type unknown and inspect the shape deliberately.
02
Choose a rejection policy
For this loader, reject the whole response if any item lacks a nonempty string ID or title, or if IDs repeat. Partial acceptance is another product policy, but it must explain omissions. Silently dropping malformed books can make data quality problems look like legitimate empty results.
03
Return a clear result
A validator returns trusted Book[] or a descriptive validation failure. Keep internal technical details separate from user copy when necessary. The loader then enters error without rendering malformed items. Do not use a type assertion to pretend that inspection occurred.
03 / MAKE SOMETHING
Your guided lab
Write and exercise a validator for the reading-list response.
Check the outer array, each required string and duplicate IDs.
Try null, a missing title, a numeric ID, duplicate IDs and a valid empty array.
Feed only validated output into the success state.
What to produce
A validator with explicit acceptance/rejection examples and an error route.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The valid empty array is accepted because it satisfies the collection contract. An item with id: 7 is rejected rather than coerced without agreement. Duplicate IDs are rejected because selection and rendering depend on identity. Trim only when the data contract permits normalization, and preserve the documented policy consistently. A validation error should not crash the renderer or become success with fabricated replacement values.
If something is not working
The validator accepts null as an object
Check for null before reading properties.
Duplicate IDs select multiple rows
Validate uniqueness at ingestion and keep identity stable.
Take it one step further
Why can an empty array pass validation while an array with one malformed item fails?
Reveal the reasoning
The schema permits zero valid books, but it does not permit malformed books. Emptiness describes quantity; validity describes the shape and invariants of the data that is present.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What does “response as Book” do at runtime?
Validates every field
Nothing; it is a type assertion
Repairs missing titles
Reference answer
B. Type assertions are erased; external values need actual runtime checks.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Keep selection consistent with the collection
A valid item ID can become invalid when the collection changes.
Design the invariant
Decide what selection means when an item disappears after refresh. You might clear the selection or move to a neighboring item. Store an ID rather than an entire duplicate object when the collection is authoritative, then derive the selected item from current data. Types help express the model, but transitions must still preserve its invariants.
Worked example
Book B is selected before a refresh removes it. Looking up B now returns undefined. The transition checks the new collection and clears selection if the ID is absent. The detail panel returns to its empty prompt rather than showing stale title data from a copied object.
Capstone practice
Implement the loader and selection transitions. Test ready-to-loading-to-error, successful empty data, malformed data and removal of the selected item. Deliver the state diagram, the typed implementation and a short record of which invalid combinations the model prevents.
Review criterion
A new developer should be able to add a state and see which presentation and transition decisions need attention. Keep assertions rare and explain any unavoidable ones.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Store identity, not a copied object
Keep selectedId and derive the selected book from the current validated collection. A copied selected object can remain visible after the source updates. An index is also fragile because sorting or filtering may move a different item into that position.
02
Define disappearance
When a refreshed collection no longer contains selectedId, choose an explicit policy: clear selection and explain it, or select a documented fallback. For this exercise, clear it. A search filter hiding an item is a different event from the authoritative collection deleting it; decide whether hidden selection should persist.
03
Reconcile at the right time
Validate the replacement collection first, then commit it and reconcile identity together. A failed refresh should not erase a valid selection simply because no new array arrived. Distinguish stale but usable data from a successfully loaded collection that no longer contains the item.
03 / MAKE SOMETHING
Your guided lab
Complete the typed loader with stable selection and a refresh scenario.
Select B from [A, B, C], reorder the collection and verify B stays selected.
Replace the authoritative collection with [A, C] and clear B explicitly.
Simulate a failed refresh and preserve the last valid data according to your stated policy.
What to produce
A typed loading/selection flow with reorder, deletion and failure evidence.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Selection uses B’s ID, so sorting does not change its meaning. On a successful replacement without B, selectedId becomes null and the interface offers a new selection. On a failed refresh, the previous valid collection remains available if that is the chosen stale-data policy, accompanied by honest failure feedback. Filtering and deletion are treated separately. This keeps identity, network state and visibility from becoming one ambiguous variable.
If something is not working
Selection follows a row number
Store the stable ID and derive its current object.
A failed refresh clears everything
Only apply collection reconciliation when a new collection has actually been accepted.
Take it one step further
Should a category filter automatically delete an item’s saved state?
Reveal the reasoning
No. Visibility is derived from the filter, while saving is an independent user choice. Reconcile only when the relevant authoritative identity contract changes, not whenever a view temporarily hides an item.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
The selected item is removed by refresh. What should the transition do?
Keep a stale copied object indefinitely
Apply a documented clear-or-neighbor selection rule
Crash on the next render
Reference answer
B. Selection must be reconciled with the current collection.
Capstone project
Build a typed reading-list loader with idle, loading, ready and error states. Add a selection model that cannot reference an absent item. Validate incoming JSON before treating it as your domain type, and document how each state is rendered.
Replace a boolean-based sketch with a state union.
Implement transitions and exhaustive presentation.
Validate incoming values and exercise failed/empty responses.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Represent loading states with a discriminated unionEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Read data only after narrowing to the ready stateEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Make the render switch exhaustiveEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Validate unknown input at the external boundaryEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Test empty data, malformed input and a retryEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Build search and retry behavior that stays correct when requests finish out of order.
For: Developers comfortable with JavaScript promises and DOM rendering. Before you begin: JavaScript functions, promises, fetch and event listeners. Your outcome: A search interface with stale-response protection, cancellation and useful pending/error states.
16 min reading · 120 min labs · 120 min project. Planning estimates.
Course map
Request ownership — Keep the interface synchronized with the user’s latest intent.
Recovery and lifecycle — Handle cancellation, errors and cleanup deliberately.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Separate the query from the result
The text being typed and the data currently visible are related but not identical values.
Model the states
Store the current query, the request status and the data associated with a completed query. A loading state can retain old results if the interface labels them clearly. Empty success means the request finished with no matches; error means the request could not establish a result. Do not use one generic empty screen for both.
Worked example
A person searches “coast,” then types “coastal.” While the second request is pending, the previous results can remain with a small updating message. When the new result arrives, the label and list change together. If it fails, the interface can explain that the update failed while retaining the previously identified results.
Practice
Draw the state sequence for first load, update, empty success and error. Write the exact status sentence for each. Include the query that produced visible data, so an old list is not silently presented as the answer to a new search.
Common mistake
Clearing everything as soon as a request begins can create unnecessary flicker. Keeping old data without a label creates a different problem: the page appears to answer a query it has not completed.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Separate three moments
A person types coast, submits it, then starts typing mountain before the response arrives. The input, active request and displayed result can now refer to different text. Give each a name instead of deriving every label from the current input.
02
Choose a stale-data policy
You may retain previous results during loading if they remain useful, but label their relationship to the earlier query. Alternatively clear them and reserve the results region. Neither choice permits showing coast results beneath a heading that claims they belong to mountain.
03
Make the fixture deterministic
Use three books and a local delayed loader whose query, result and delay are explicit. Start with one request before introducing races. The small fixture lets you predict the final screen without relying on a changing remote catalogue.
03 / MAKE SOMETHING
Your guided lab
Create a search model with draftQuery, activeQuery and resultQuery.
Submit coast and edit the input to mountain while loading.
Render the pending operation and any retained results truthfully.
Record which query each visible label describes.
What to produce
A search-state diagram and a demonstration of editing during a request.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The input can show mountain while the pending status says Searching for coast. If coast completes before another search starts, the result heading identifies coast. The draft remains mountain. Submitting mountain creates a new operation rather than retroactively renaming the old one. This explicit separation prevents a common race-shaped presentation defect even before two requests overlap.
If something is not working
The result heading changes while typing
Render it from resultQuery rather than the draft input.
Old results look current during loading
Label retained data or clear it according to a documented policy.
Take it one step further
Is retaining old data during loading inherently incorrect?
Reveal the reasoning
No. It can preserve context. The interface must make clear which operation produced it and whether a new request is pending, so stale data is not mistaken for the latest result.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A request succeeds with no matches. Which state is accurate?
Network error
Empty success with a useful next action
Indefinite loading
Reference answer
B. The request established an empty result; it did not fail.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Let the latest request own the screen
Requests do not necessarily finish in the order they started.
Guard the commit
Assign a monotonically increasing request ID. Capture it when starting work and check it before committing either data or an error. This protects the UI even if the underlying work cannot be canceled. A stale request may finish, but it no longer has permission to change the current screen.
Worked example
Search A starts first and takes 900ms. Search B starts later and takes 100ms. Without an ownership check, A overwrites B after B has already appeared. Checking the captured ID against the latest ID prevents both stale results and stale failures from replacing the current state.
Practice
Create a fake search function with two controlled delays. Start A and B quickly, then confirm that only B is rendered. Reverse which request fails. Test the error branch as carefully as the success branch; a stale rejection must not show an error over fresh results.
Common mistake
Debouncing reduces how often requests start, but it does not prove that responses arrive in order. Keep correctness separate from the strategy used to reduce work.
let latest = 0;
async function search(query) {
const request = ++latest;
try {
const items = await loadBooks(query);
if (request === latest) renderResults(items);
} catch (error) {
if (request === latest) renderError(error);
}
}
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Arrange a race on purpose
Let coast take 800ms and mountain take 100ms. Start coast first, then mountain. Without an ownership rule, coast may finish last and overwrite the intended mountain screen. Reverse the delays as a second scenario rather than trusting one favorable order.
02
Guard every settlement
Increment a request token when a new operation begins. Capture it inside that operation and check it before committing success, error or pending cleanup. Guarding only the data update leaves stale failures or finally blocks free to overwrite the current status.
03
Separate correctness from frequency
Debouncing reduces how often operations start. It cannot guarantee their completion order. Use it only when it suits the interaction, while preserving an ownership rule that works under arbitrary response ordering.
03 / MAKE SOMETHING
Your guided lab
Build a controlled two-request race with independent success/failure outcomes.
Start slow coast followed by fast mountain and assert the final query is mountain.
Make the old request reject after mountain succeeds.
Inspect loading cleanup so the old operation cannot settle the new one.
What to produce
A latest-request ownership guard with race and stale-error checks.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Each request captures its own integer token. A result or exception commits only while that token equals the latest token. The old coast failure is ignored after mountain owns the screen, and an old finally block cannot clear mountain’s loading state. Keep the final assertion about the query and items, not merely the number of calls. Correct behavior should survive both completion orders and a stale rejection.
If something is not working
Old errors flash after a new success
Apply the ownership guard to the error branch too.
Loading ends too early
Guard cleanup or make settlement a single owner-checked transition.
Take it one step further
Why can a guarded success branch still leave a race defect?
Reveal the reasoning
Other branches can mutate the same state. A stale catch may show an error, and an unguarded finally may clear a newer loading indicator. Every settlement must respect ownership.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Does debouncing alone prevent stale responses?
Yes, always
No; request completion can still be reordered
Yes, if the delay is longer than the average request
Reference answer
B. Debouncing changes start frequency; ownership checks protect the commit order.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Cancel work without confusing failure
Cancellation describes work you no longer need, not necessarily a failure the user must repair.
Use the lifecycle
Create an AbortController for a request and pass its signal to APIs that support cancellation. Abort the previous request when it becomes obsolete and clean up when the owning view is removed. Handle an intentional abort differently from a network error. Keep an ownership guard because cancellation may arrive after useful work has already completed.
Worked example
A search view starts fetch with a signal. Typing a new query aborts the old request, and leaving the view aborts the current one. The interface does not flash “Something went wrong” for those intentional aborts. A genuine server failure, however, enters a visible retryable error state.
Practice
Add cancellation to the delayed-search exercise. Count started, aborted and committed requests. Navigate away before a response completes. Confirm that removed UI is not updated and that cancellation does not leave a permanent loading indicator when the view returns.
Common mistake
Creating a controller without passing its signal changes nothing. Follow the signal through the actual API call and verify the resulting behavior rather than trusting the presence of the constructor.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Pass the signal through
Creating AbortController alone does nothing. Pass its signal into fetch or your compatible loader. For a custom delayed fixture, listen for abort, clear its timer and reject with an AbortError so the exercise actually models cancellation.
02
Use lifecycle boundaries
Abort the previous operation when a new query supersedes it, and abort active work when the view is disposed. Mark the view inactive or invalidate its request token as well. A completed or non-cancellable operation still must not update removed UI.
03
Classify cancellation
An intentional abort is part of ordinary navigation, not a network failure needing a red alert. A genuine error still needs feedback. Distinguish them by the operation’s abort state and error contract rather than suppressing every exception indiscriminately.
03 / MAKE SOMETHING
Your guided lab
Add cancellation and teardown to the controlled search exercise.
Trace the signal from controller to the actual asynchronous operation.
Count started, aborted and committed operations during rapid search changes.
Dispose the view mid-request and confirm that no later commit occurs.
What to produce
A cancellable loader and a lifecycle report with observable operation counts.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A new search aborts the old controller and receives a fresh token. An intentional AbortError does not become visible failure. Disposing the view aborts current work and invalidates ownership. The counters demonstrate that cancellation reaches the loader, while the no-late-commit assertion demonstrates correctness independently. Keep the two claims separate: cancellation can save work, and ownership protects the screen when cancellation is late or unsupported.
If something is not working
The abort count never changes
Verify that the loader receives and observes the signal.
All errors disappear
Handle intentional abort separately and preserve real failure reporting.
Take it one step further
Can cancellation replace the latest-request guard completely?
Reveal the reasoning
No. Some work may already have completed or may not support cancellation. Ownership remains the final rule for whether a result is allowed to change the interface.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
An obsolete search is intentionally aborted. What should the UI usually do?
Show a loud network failure
Allow the newer request to continue without a stale error
Restore the obsolete query
Reference answer
B. The cancellation is part of normal lifecycle management, not a new user problem.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Make retry repeat the intended operation
A retry button needs a clear relationship to the failed request.
Capture the intent
Decide whether retry uses the last failed query or the currently edited query. Make the label and implementation agree. Prevent uncontrolled duplicate submission, but restore the action after a failure. Check response.ok before treating a fetch response as successful, because HTTP error status does not automatically reject the promise.
Worked example
The failed query is “coast,” but the input now reads “mountain.” A button labeled “Retry coast” should retry coast, not silently use mountain. Alternatively, “Search again” can use the current input if that contract is clear. For a 503 response, show the error state even though fetch resolved to a Response object.
Capstone practice
Complete the search and run a table of scenarios: empty query, zero matches, HTTP failure, reordered completion, cancellation and retry after editing. Use a deterministic service so each case is repeatable. Record the query and data shown at the end of every test.
Review criterion
The final screen must belong to a clearly identified user intent. Smooth loading animation does not compensate for data attached to the wrong query.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Capture the failed operation
If coast fails and the draft now says mountain, a button labeled Retry coast must use coast. A button labeled Search mountain can use the draft. Keep the chosen query in the operation record so a rerender does not silently change its meaning.
02
Inspect the response status
Fetch can resolve for HTTP error responses. Check response.ok before accepting the body, then validate the payload. A successful transport and parse do not establish a successful application result. The local fixture should include an HTTP-style failure and a malformed successful payload.
03
Close the scenario table
Combine zero matches, empty input, stale completion, cancellation, retry after editing and HTTP failure. For each, state the final query, items, status and available action. This table is the acceptance contract for the complete search experience.
03 / MAKE SOMETHING
Your guided lab
Finish a search whose failed coast request can be retried after editing the draft.
Choose and label the retry contract explicitly.
Simulate status 503, a malformed body and a valid empty array.
Run the full scenario table and inspect the final owner of every screen.
What to produce
A complete asynchronous search and a deterministic acceptance report.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Retry coast captures coast, creates a new request token and uses a fresh controller. A 503 produces a retryable failure before payload acceptance. A malformed response becomes a data error, while [] becomes a successful empty state. Editing the input does not rename the retry. Each scenario ends with data and labels attached to the same known intention, making the interface understandable even when operations finish unexpectedly.
If something is not working
A 503 becomes success
Check response.ok before constructing the success state.
Retry uses whatever is currently typed
Use the captured failed query or rename the action to match the draft.
Take it one step further
A response is HTTP 200 but its body is an error-shaped object. Is the list ready to render?
Reveal the reasoning
No. HTTP success is only one boundary. Validate the application payload before accepting it as books, and present an appropriate data failure if it does not satisfy the contract.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
fetch resolves with HTTP 503. What should your loader check?
Only whether the promise resolved
response.ok or the status before accepting the result
Only whether the body parses as JSON
Reference answer
B. HTTP error responses can resolve normally; status must be interpreted.
Capstone project
Build a book search with a deterministic mock service that can delay or fail each query. Ensure the newest query owns the screen, preserve the last useful state where appropriate, and provide a retry that uses the intended query.
Build a mock service with controllable delays.
Implement the request ownership and state transitions.
Run reordered-response and failure/retry scenarios.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Separate query, request status and visible resultsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Prevent older responses from replacing newer onesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Cancel obsolete work when practicalEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Distinguish empty success from network failureEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Test delayed responses, rapid typing and retryEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Turn product promises into observable checks for state, keyboard behavior and persistence.
For: Developers who can build a small interactive web application. Before you begin: JavaScript, browser developer tools and familiarity with an existing app. Your outcome: A focused test plan and executable checks for a saved reading-list journey.
16 min reading · 120 min labs · 120 min project. Planning estimates.
Course map
Choose the evidence — Test rules at the right level and design meaningful cases.
Exercise the journey — Verify real interaction and keep fixtures isolated.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Translate promises into observations
“Saving works” is too vague to tell you what should be checked.
Write a behavior contract
Describe a starting state, an action and an observable result. Include the thing that must remain unchanged. Test at the smallest useful level: a filtering function can prove data selection, while a browser journey proves that a control calls it and presents the result. Neither replaces the other.
Worked example
Given three books and no saved items, saving Book A should add exactly A to the saved set, update the button and make A appear in the saved view. Saving it again should remove it if the control is a toggle. The original book catalogue must retain its order. These are distinct claims that deserve distinct evidence.
Practice
Write five contracts for the reading list. Include a zero-result search and a save action while a category filter is active. Label which contracts belong to pure logic tests and which require the rendered interface.
Common mistake
A test that merely checks whether a function was called can pass while the user sees incorrect output. Prefer meaningful state or visible-result assertions when they capture the actual promise.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Make the promise falsifiable
“Saving works” is broad. Given books A, B and C with no saved items, activating Save on B should add exactly B, update its control and show B in the saved view. The source catalogue must remain unchanged. A plausible count of one is insufficient if the wrong item was saved.
02
Choose the evidence level
A pure function test can establish toggle behavior and immutability. A browser check establishes that the visible control invokes the behavior, shows the result and remains operable. Visual inspection assesses hierarchy and clipping. Choose the smallest level that can support each claim.
03
Describe setup explicitly
Record fixture data, initial state and the action. Avoid tests that depend on whichever user data happens to exist. A meaningful failure message should identify the protected promise so another developer can understand why the check matters.
03 / MAKE SOMETHING
Your guided lab
Write five behavior contracts for a reading list before implementing tests.
Include save, unsave, zero results, combined filters and reload persistence.
Assign each contract to pure logic, browser interaction or visual review.
Specify the expected IDs and one invariant for each data-changing action.
What to produce
A test plan whose expected outcomes can be checked without guessing.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
For saving B, assert the saved IDs equal [B], then toggle again and assert []. Separately assert the original catalogue IDs remain [A, B, C]. In the browser, verify the button’s accessible state and the saved view’s content. Persistence needs an actual reload. Keep these claims distinct so a unit pass is not presented as proof of a working rendered journey or durable browser storage.
If something is not working
The assertion checks only a handler call
Assert the resulting state or visible behavior that the user depends on.
Expected results come from the implementation
Write the fixture’s expected IDs independently by inspection.
Take it one step further
Why is a count-only assertion weak for a saved list?
Reveal the reasoning
The list could contain the wrong item while retaining the correct count. Identity and absence of unrelated items are part of the actual promise.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which assertion best tests a saved view?
The save handler was called
The intended saved item is visible and unrelated items are absent
The count increased, without checking which item was saved
Reference answer
B. The visible result matches the task the user is trying to complete.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Test boundaries and combinations
Many defects appear where individually correct features meet.
Build a compact matrix
Test empty input, normal input, repeated input and boundary values. Add combinations that share state, such as search plus category or saved plus sort. Use small fixtures where the expected result is obvious. Keep the source array unchanged so one test cannot silently alter the next.
Worked example
A price sort mutates the global catalogue in place. Search tests still pass individually, but the default curated order changes after using the sort menu. Copying before sort preserves the catalogue contract. A test should compare the original ID sequence before and after filtering, not only inspect the sorted result.
Practice
Create four fixture books with two categories and distinct prices. Test a combined query/category filter, a query with no matches, and ascending price order. Then assert that the fixture’s original ID sequence is unchanged. Add a duplicate saved ID to test normalization.
Common mistake
Huge realistic fixtures can make expected behavior difficult to see. Begin with the smallest set that demonstrates the rule, then add a specific fixture only when it exposes a real edge.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Make the expected answer obvious
Use A: Travel, 20; B: Nature, 10; C: Travel, 30; D: Fiction, 15. Give A and C titles containing coast. Query coast plus category Travel should return A and C; ascending price should preserve that order. A small fixture makes the answer auditable.
02
Combine shared-state features
Search, category, saved-only and sort all affect the same visible collection. Test selected combinations that could interfere rather than multiplying every possible case without purpose. Include a no-match query and an empty source list.
03
Protect the source
Snapshot the source ID order and relevant values, run a sort/filter operation, then compare the source again. Array.sort mutates its receiver. A result can be correct while the shared catalogue is damaged for the next interaction.
03 / MAKE SOMETHING
Your guided lab
Implement focused data checks for the four-book fixture.
Assert exact IDs for combined query/category and saved-only cases.
Check empty input, no matches and duplicate saved-ID normalization.
Assert source data is unchanged after sorting and toggling.
What to produce
A compact, deterministic suite with readable fixture-specific expectations.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Use a copied array before sorting and derive each view from the authoritative source. Keep expected IDs literal in the test so it does not reproduce the same filtering algorithm. Duplicate saved IDs should normalize according to the stated storage contract. If a failure only appears after another test ran, inspect shared mutation or setup leakage before adding retries. Deterministic fixtures should make order-independent outcomes possible.
If something is not working
Tests pass only in one order
Reset isolated state and inspect mutations to shared fixtures.
A huge fixture obscures the failure
Reduce it to the smallest set that still exposes the broken rule.
Take it one step further
Should a filtering test calculate its expected IDs by calling the same filter helper?
Reveal the reasoning
No. That repeats the implementation rather than independently checking it. Use explicit expected results for a small fixture or another genuinely independent oracle.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A sorted result is correct but the original array changed. What does that reveal?
A harmless implementation detail in every app
A mutation that may break other views
A change confined to the temporary filtered result
Reference answer
B. Shared source mutation can change later results even when this one output looks correct.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Exercise the actual interface
The browser adds focus, layout, timing and storage behavior that a pure function does not contain.
Follow the user’s route
Find controls by role and accessible name when possible. Operate search, open details, complete the free lesson and inspect the library. Wait for a meaningful state rather than an arbitrary long delay. Include keyboard navigation and Escape behavior for dialogs, then verify the state after reload.
Worked example
A lesson completion test clicks “Mark lesson complete,” observes the completed label and checks the library count. After reload, the count remains. It also checks that a locked lesson cannot be opened before demo enrollment. Merely seeing a progress bar would not establish either persistence or access behavior.
Practice
Run the journey once manually and write down the exact visible labels. Automate the stable steps with your chosen browser-testing tool. Use a separate test storage key or isolated browser context so the test does not clear someone’s real notes or enrollments.
Common mistake
Forcing clicks through overlays can hide a usability failure. If the control cannot be reached normally, inspect why before weakening the test. A passing test should reflect a possible user action.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Follow visible affordances
Locate the search field by its label, Save by its accessible name and the saved view by its navigation text. Use ordinary clicks and keyboard activation. A forced click through an overlay can make automation pass while a real user remains blocked.
02
Wait for meaning
Wait for a visible state, enabled control or expected result instead of an arbitrary long delay. Asynchronous work can be slower or faster across machines. A condition-based wait connects the test to the behavior it is meant to establish.
03
Own the test storage
Use an isolated browser context or a dedicated test storage namespace. Seed only the test fixture and remove only that fixture afterward. Verify persistence by reloading the actual application rather than reading a mocked value that bypasses its startup logic.
03 / MAKE SOMETHING
Your guided lab
Automate search, save, saved-view inspection and reload persistence.
Run the journey manually once and note the actual labels and focus route.
Repeat with automation using normal accessible interactions.
Reload, verify the saved identity and confirm real user storage was untouched.
What to produce
A browser journey with isolated setup, meaningful waits and cleanup.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The test starts from an owned empty state, searches coast, saves B only if B is the intended fixture item, opens the saved view and inspects exact content. Reloading retains the saved state through the app’s real initialization. A separate keyboard pass confirms control reachability and dialog dismissal where relevant. Keep storage cleanup scoped to the test key; clearing all localStorage would make the test destructive in a shared environment.
If something is not working
The test needs forced clicks
Inspect overlays, scrolling and disabled states before weakening interaction checks.
The test erases real notes
Use a separate namespace or browser context and narrow cleanup.
Take it one step further
Does directly writing the expected progress value and then reading it prove the completion button works?
Reveal the reasoning
No. It bypasses the action and application transition. Operate the button, inspect the resulting UI and then reload to establish the complete persistence path.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Why use isolated storage for a browser test?
To avoid rendering the page
To keep test setup from altering real progress and notes
To skip the reload step entirely
Reference answer
B. Tests should be repeatable without destroying user-owned state.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Keep a regression test worth maintaining
A good regression check protects a behavior that mattered enough to fail.
Reproduce before fixing
Record the trigger, expected result and actual result. Make a test fail for that reason, apply the fix, and verify the same test passes. Avoid asserting every CSS class or internal helper call unless that is the contract. Visual judgment still belongs in a separate review of hierarchy, clipping and readability.
Worked example
A saved item disappears from the catalogue when the saved filter is cleared because the implementation replaced the source list. A four-item fixture reproduces it. The fix derives the visible list instead. The regression test checks the restored IDs, while a browser check verifies that the Clear filters control actually reaches that state.
Capstone practice
Introduce a deliberate source-array mutation, observe your test fail, and then restore the correct implementation. Deliver a short report listing automated outcomes, manual observations and untested environments. Keep one screenshot of a meaningful state, not a folder of unexplained captures.
Review criterion
Another developer should understand which promise each test protects. Remove assertions that only mirror implementation and do not distinguish a correct result from a plausible-looking failure.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Introduce a controlled defect
In a disposable local copy, replace a copy-before-sort operation with an in-place sort. Run the source-order invariant and observe its failure. Restore the correct operation and run the same check again. Never leave the deliberately broken variant in the delivered app.
02
Review what the failure means
A test is useful if it fails for the intended behavior, not an unrelated syntax error or unavailable server. Inspect the assertion message and actual IDs. If the failure is incidental, repair the experiment before claiming the regression is covered.
03
Keep the suite understandable
Name tests after behavior, remove redundant implementation assertions and document manual gaps separately. Screenshots can support a layout review, but they need a known state and an interpretation. A large count of assertions is not itself evidence of broad quality.
03 / MAKE SOMETHING
Your guided lab
Complete the reading-list test report with a deliberate regression experiment.
Capture the failing behavior and exact assertion on the defective version.
Restore the fix and rerun the affected checks.
Separate automated results, manual observations and environments not examined.
What to produce
A maintained regression check and a concise evidence report.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The report says that in-place sorting changed [A, B, C, D] into price order, identifies the invariant that failed and shows the restored source order after copying before sort. It then records the browser route used to verify the visible control reaches the correct state. Unsupported browser or assistive-technology claims remain outside the report. This makes the evidence specific enough to trust and the test specific enough to maintain.
If something is not working
The defective version still passes
Check whether the assertion observes the actual protected behavior.
The test fails only because setup broke
Repair setup and reproduce the intended defect before evaluating the fix.
Take it one step further
Is increasing the assertion count always an improvement?
Reveal the reasoning
No. Assertions should distinguish meaningful correct and incorrect behavior. Redundant checks that mirror internals can increase maintenance cost without protecting another user promise.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What makes a regression test useful?
It fails for the reported defect and passes after the fix
It always passes
It repeats every line of the implementation
Reference answer
A. The test should discriminate the behavior that previously broke.
Capstone project
Test a reading list with filtering, saving and persisted progress. Cover pure data rules with unit tests and the complete user journey in the browser. Include one deliberately introduced defect and demonstrate the test that catches it.
Map the critical journey and its invariants.
Write focused data tests and browser scenarios.
Introduce a regression, observe failure, fix it and rerun the affected checks.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Translate each promise into an observable outcomeEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Cover combined filters and source-data immutabilityEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Exercise keyboard, empty state and duplicate actionsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Verify reload persistence without contaminating real user dataEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Document what automation and manual review each establishEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Find the bottleneck in a visual page, make a measured change and preserve the experience while reducing work.
For: Frontend developers comfortable profiling a working page. Before you begin: HTML, CSS, JavaScript and browser performance/network tools. Your outcome: A before/after performance investigation with a repeatable scenario and a documented budget.
16 min reading · 120 min labs · 150 min project. Planning estimates.
Course map
Observe before changing — Connect performance measures to a user journey.
Reduce and verify — Make targeted changes and evaluate both speed and visual quality.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Choose the moment that feels slow
A fast initial render does not guarantee a responsive search or a stable page.
Separate the concerns
Loading, interaction latency and layout stability describe different experiences. Core Web Vitals currently include LCP, INP and CLS, but a local lab run is not a field distribution. Define the journey you are investigating and the device/network conditions. A metric is a signal to inspect, not a replacement for understanding what the user was doing.
Worked example
A catalogue displays its title quickly but its large hero image arrives late. Search is responsive until every keystroke rebuilds dozens of complex cards. A late image without reserved space pushes the filter bar downward. These are three different problems; minifying one stylesheet may not solve any of their main causes.
Practice
Record opening the page, typing a query and scrolling to the first card. Note the visible delay and inspect the relevant network or performance trace. Choose one moment to improve and write a hypothesis about the work causing it.
Common mistake
Comparing a cached desktop run with an uncached mobile run produces an impressive but meaningless difference. Keep conditions consistent and state what the measurement covers.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Choose the journey
For a visual catalogue, distinguish initial hero loading, typing into search and movement caused by late media. These are different experiences with different causes. Select one first and record the device, viewport, network profile, cache state and application version.
02
Capture a baseline
Repeat the same route several times under the same conditions. Keep the individual observations, not only the most favorable result. Browser extensions, warm caches and background activity can affect local measurements. A trace helps connect a visible pause to actual work.
03
Interpret the metric
LCP concerns a loading milestone, INP concerns interaction responsiveness in its measurement context and CLS concerns unexpected layout shifts. A short local run is not a field distribution. Use the appropriate lab observation and describe its limits rather than claiming to have established real-user performance.
03 / MAKE SOMETHING
Your guided lab
Investigate either catalogue loading or search responsiveness under a documented profile.
Write the exact route and conditions before measuring.
Capture three baseline runs and retain the trace for a representative slow case.
Identify the visible moment and the work that plausibly explains it.
What to produce
A baseline table, a trace annotation and one testable bottleneck hypothesis.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A useful report might record three search-interaction durations and identify a long synchronous filtering/rendering task in the trace. It does not conclude that images are the cause simply because images are large. If loading is the target, inspect request timing, discovery and rendering separately. The hypothesis should name a specific change and the observation expected to improve, making the next experiment interpretable.
If something is not working
Only the fastest run is reported
Retain all comparable runs and describe variation.
A score replaces the investigation
Connect the score or timing to a visible journey and trace evidence.
Take it one step further
Can a single fast desktop run establish good experience for all visitors?
Reveal the reasoning
No. It establishes one observation under stated conditions. Device, network, cache and real interaction patterns vary; broader claims require broader evidence.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A single local trace shows faster loading. What does it establish?
All real users are faster
Improvement in that measured scenario
Guaranteed field Core Web Vitals compliance
Reference answer
B. A lab result is bounded by its conditions; field behavior requires field evidence.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Give the important image a sensible budget
Image quality is a design decision constrained by display size, crop and delivery cost.
Match asset to use
Export images near the sizes actually displayed and provide responsive candidates when appropriate. Reserve width/height or aspect ratio so the layout knows the space before decoding. Prioritize genuinely important above-the-fold media and defer offscreen media thoughtfully. Evaluate the compressed result at its actual size, including gradients and fine edges.
Worked example
A 4000px photograph is displayed in a 360px card. A smaller candidate reduces transfer and decode work without visibly changing the card. The hero still receives a larger source because its crop fills a wide display. Supplying one tiny image for every placement would improve bytes while damaging the design’s central material detail.
Practice
Export three candidate sizes for one photograph. Compare file size, rendered sharpness and decode behavior at the intended placement. Add dimensions and verify that the filter bar no longer shifts when the image loads. Keep your choice and its reason in the budget notes.
Common mistake
Lazy-loading the largest immediately visible image can delay the main content. Decide priority from the actual opening composition rather than applying one attribute to every image.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Identify the actual image
Inspect which image matters to the first useful view and how it is discovered. A CSS background, an image inserted late by script and an img in initial markup have different discovery paths. Avoid treating every image as equally urgent.
02
Match delivery to display
Prepare sensible source dimensions and compression, provide responsive candidates when needed and reserve the intended aspect ratio. Review the image at actual display scale for visible damage. A smaller file that destroys the focal subject does not satisfy the design task.
03
Prioritize selectively
Do not lazily load the critical above-the-fold image simply because lazy loading sounds efficient. Defer genuinely offscreen media and verify that the important resource is requested when expected. Too many high-priority resources compete and dilute the intended benefit.
03 / MAKE SOMETHING
Your guided lab
Reduce the catalogue’s important image cost and preserve its composition.
Record the displayed dimensions, source dimensions, transfer size and request timing.
Create an appropriately sized candidate and reserve media space.
Repeat the baseline route and compare both timing and visible quality.
What to produce
A before/after image investigation with comparable captures and request evidence.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The replacement has enough resolution for the tested display without shipping unnecessary pixels. Its dimensions or aspect-ratio reserve layout space, and the browser can discover it promptly. Offscreen cards can defer their images independently. The report includes transfer size and observed loading behavior plus a visual comparison of detail and crop. It avoids declaring a universal compression setting because acceptable quality depends on the actual artwork.
If something is not working
Loading improves but the image looks damaged
Review compression and dimensions at the intended scale.
The hero appears late despite a small file
Inspect discovery, request priority and render dependencies.
Take it one step further
Why can lazy loading make an important first-screen image worse?
Reveal the reasoning
It can delay the resource’s request until layout or visibility checks occur. Critical content should be discoverable promptly; deferral is more useful for genuinely offscreen media.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Why reserve an image’s dimensions?
To make its pixels load instantly
To give layout the expected space before loading
To disable responsive sizing
Reference answer
B. Known dimensions reduce unexpected movement as the image becomes available.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Reduce work on the interaction path
The fastest task is often the work you can avoid doing on every input.
Inspect the cost
Profile a concrete interaction before optimizing it. Look for repeated layout reads/writes, expensive synchronous computation and unnecessary rebuilding. Batch reads before writes where possible. Schedule visual updates with the browser, but remember that requestAnimationFrame does not make expensive work free. It only aligns a callback with rendering opportunities.
Worked example
Dragging a slider reads every card’s dimensions and then changes each style in alternating order. The trace shows repeated layout work. Read the needed geometry once, calculate the values, then write the updates together. If the effect is offscreen or motion is paused, stop scheduling it rather than continuing invisible work.
Practice
Instrument the number of updates during a five-second interaction. Remove one redundant computation or DOM reconstruction and repeat the same input sequence. Compare the trace and inspect the final visual state. Test rapid input to ensure skipped intermediate work still settles correctly.
Common mistake
An arbitrary delay can make the interface feel smoother by postponing work while making it less responsive. Preserve immediate feedback and move or reduce the expensive work deliberately.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Locate the long work
Record typing, filtering and rendering separately where possible. Rebuilding every card, sorting repeatedly or performing layout reads after writes can dominate an interaction. A loading spinner cannot make a blocked main thread responsive if it also cannot render.
02
Choose one intervention
Cache stable derived data, reduce unnecessary DOM replacement, batch reads and writes, or divide appropriate work into smaller tasks. Select the intervention that matches the trace. Debouncing changes when work starts and may alter the interaction; it does not remove excessive work by itself.
03
Recheck the result
After optimization, repeat the same query and inspect exact result IDs, sort order, focus and empty-state behavior. Performance changes often introduce stale caches or skipped updates. A faster wrong answer is not an acceptable improvement.
03 / MAKE SOMETHING
Your guided lab
Optimize one measured search bottleneck without changing the result contract.
Annotate the expensive work in the baseline trace.
Apply one targeted change and repeat the same three-run scenario.
Run correctness and keyboard checks on the optimized path.
What to produce
A trace-supported intervention with performance and behavior evidence.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
If repeated sorting dominates, derive a stable sorted source once when its inputs change rather than on every keystroke. Invalidate that cache when the source or sort choice changes. Compare the same query sequence before and after, then verify exact IDs and focus continuity. The report should attribute the improvement cautiously to the measured change and retain any remaining long task for later investigation.
If something is not working
Cached results stop updating
List the cache dependencies and invalidate when any changes.
The page feels delayed after debouncing
Review the interaction tradeoff and reduce underlying work where the trace supports it.
Take it one step further
An optimization halves rendering time but keeps an old filter result after data refresh. Is it complete?
Reveal the reasoning
No. The derived-data dependency is broken. Restore correctness, then measure the corrected implementation under the same conditions.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What does requestAnimationFrame guarantee?
That a heavy callback becomes cheap
A callback scheduled in relation to a rendering opportunity
A fixed 60 frames per second
Reference answer
B. The callback still consumes time; scheduling does not remove its cost.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Write a budget that protects the experience
A useful budget connects a measurable limit to something the product should preserve.
Define a scenario
State the page, task, device class, viewport, network and cache conditions. Choose a small number of limits you can measure repeatedly, such as image transfer or long tasks during a specific interaction. Keep visual and accessibility checks beside the performance evidence so an optimization cannot quietly remove essential content.
Worked example
The catalogue budget limits offscreen card image work during the opening view and checks that search remains responsive with all 26 entries. The before/after report includes the same viewport and input sequence, multiple runs and representative screenshots. It describes the measured change without claiming that one local browser predicts every visitor’s experience.
Capstone practice
Deliver the baseline trace, one targeted change and repeat measurements. Record the median and the range across several comparable runs. Explain what became cheaper, what stayed visually equivalent and what you did not test. Add a regression check for the specific waste you removed.
Review criterion
A reviewer should be able to repeat your scenario and understand the tradeoff. A score without conditions is weaker evidence than a modest, well-explained improvement.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Choose a small set of limits
A budget can constrain image transfer size, script cost or an observed interaction duration under a named profile. Pick limits connected to this experience and baseline. A number copied from another project without context is difficult to use or defend.
02
Specify how to check it
Write the route, cache condition, device/profile, number of runs and interpretation rule. Keep raw measurements and version identifiers. If results vary, report that spread rather than moving the goalpost until the latest version appears to pass.
03
Protect the design task
Include visual and functional checks alongside timing. An aggressive crop, unreadable placeholder or missing result may reduce work while undermining the product. Record the accepted compromise and the conditions that would require revisiting it.
03 / MAKE SOMETHING
Your guided lab
Deliver the catalogue performance investigation and a maintainable budget.
Compare baseline and final runs using the same measurement conditions.
Define two project-specific limits and a repeatable checking method.
Document visual tradeoffs, remaining bottlenecks and the difference between lab and field evidence.
What to produce
A performance report with raw runs, final captures, budget and limitations.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The final report identifies the bottleneck, change and observed effect, with all comparable runs visible. Its budget might constrain the hero asset and a specific search interaction on the chosen profile; those are local project decisions rather than universal guarantees. The visual comparison confirms the catalogue still communicates its content, and behavioral checks confirm filtering remains correct. Remaining uncertainty is specific enough to guide the next investigation.
If something is not working
The budget has no measurement method
Add the scenario, conditions and interpretation rule.
A faster version silently removes content
Restore the task or explicitly reconsider the product requirement before accepting the tradeoff.
Take it one step further
What should happen when a new feature exceeds the budget but provides clear user value?
Reveal the reasoning
Investigate alternatives and measure the tradeoff. Either reduce other work or deliberately revise the budget with evidence and ownership. Silently ignoring the limit makes it cease to be a useful decision tool.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What belongs in a before/after performance report?
Only the best score
Comparable conditions, repeated results and visual tradeoffs
A claim of universal speed
Reference answer
B. Repeatability and scope make the improvement assessable.
Capstone project
Optimize a visual catalogue under a documented device/network profile. Investigate loading, responsiveness and layout stability separately. Change one bottleneck at a time, retain visual comparison images and report measured evidence rather than claiming universal speed.
Capture a baseline journey and trace under stated conditions.
Change one image, script or rendering bottleneck and repeat.
Define a small budget and document the tradeoffs and remaining uncertainty.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Record the device, viewport, network and cache conditionsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Identify a bottleneck from a trace rather than a guessEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Improve loading or interaction without breaking the visual taskEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Reserve media space and test layout stabilityEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Compare repeat runs and distinguish lab evidence from field dataEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Compose a small interactive sculpture while learning the scene, camera and rendering loop from first principles.
For: JavaScript developers taking their first step into browser-based 3D. Before you begin: JavaScript modules, DOM events and a local project with a bundler that resolves npm imports. Install three@0.186.0 in that project; WebGL2 is required. Your outcome: A responsive three-object scene with a controllable camera, a pause control and deliberate cleanup.
15 min reading · 120 min labs · 150 min project. Planning estimates.
Course map
Build the world — Separate object, camera and renderer responsibilities.
Make it belong to the page — Handle sizing, time, controls and resource lifetime.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Place the camera before adding effects
A 3D scene becomes understandable when you can explain what is being viewed and from where.
Three responsibilities
The scene holds objects. The camera describes a view. The renderer draws that view into a canvas. Begin with a plain material so lighting is not another unknown. Create a one-unit box at the origin and position the camera several units away. Look toward the origin and render once before introducing an animation loop.
Worked example
For a small sculpture, place a sphere at x = -1.4, a box at the origin and a ring at x = 1.4. Put the camera at (0, 1.5, 6). The lateral spacing makes the three silhouettes readable. A camera accidentally inside the box produces a confusing view that brighter lights will not fix.
Practice
Use the starter below as your module entry in a local bundled project with three@0.186.0 installed. A bare browser import needs an import map; this example assumes your bundler resolves the npm package. Change only camera position, then only object position. Explain the difference in a sentence. Add a nearby HTML description of the sculpture.
Common mistake
When nothing appears, inspect canvas size, camera direction and object placement before adding effects. Reduce the scene to one object to isolate the missing relationship.
import * as THREE from "three";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 100);
camera.position.set(0, 1.5, 6);
camera.lookAt(0, 0, 0);
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshNormalMaterial();
scene.add(new THREE.Mesh(geometry, material));
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(480, 480);
document.body.append(renderer.domElement);
renderer.render(scene, camera);
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Establish coordinates
Use a box at the origin, a sphere to its right and a ring behind them. In Three.js, the camera looks along its local negative Z axis. Place it away from the objects and aim it deliberately; moving the camera and moving the subject are different compositional choices.
02
Frame before decorating
Use simple materials and one useful light. Adjust distance, field of view and target until the three objects read clearly. Keep near and far clipping planes appropriate to the scene scale. Effects cannot rescue an object that is outside the camera’s view or clipped.
03
Record the composition
Write the camera position, target and field of view. Compare a frontal and elevated view of the same objects. Explain which reveals overlap and depth more effectively instead of selecting a view only because it appears dramatic.
03 / MAKE SOMETHING
Your guided lab
Compose a small three-object garden using the pinned Three.js project environment.
Create the objects at known coordinates and add a camera with explicit clipping planes.
Compare two camera positions with identical geometry and lighting.
Record the selected view and a reset-camera target.
What to produce
A legible scene, two comparison captures and reproducible camera settings.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The sphere, box and ring remain distinguishable, with overlap that suggests depth without hiding a subject. Reset restores the recorded composition. If a subject disappears, inspect its world position, camera direction and clipping before changing the renderer. This first scene should be intentionally simple enough that each adjustment has an understandable consequence.
If something is not working
The canvas is blank
Check size, camera aim, object position and material/light compatibility.
The subject vanishes when approaching
Inspect the near clipping plane and camera intersection.
Take it one step further
Why keep the same lighting while comparing two camera positions?
Reveal the reasoning
It isolates the composition change. Altering lighting simultaneously makes it harder to identify whether the improvement came from viewpoint or shading.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which object defines the viewpoint?
The material
The camera
The geometry
Reference answer
B. The camera determines the view; geometry supplies shape and material supplies surface appearance.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Group objects around a useful pivot
Transforms become easier to control when the hierarchy matches the movement you intend.
Local and shared movement
Each object has a transform relative to its parent. Put the three sculpture pieces in a Group and rotate the group to turn the whole composition. Move a child to change its place within that composition. Choose the group origin as the pivot you actually want; a misplaced pivot makes an apparently simple rotation orbit around a distant point.
Worked example
The ring should spin around its own center while the garden turns slowly as a whole. Give the ring its own rotation and the parent group a separate rotation. Moving the parent changes the complete arrangement; changing the ring does not disturb its neighbors. Draw this hierarchy as a small tree before coding.
Practice
Create a garden group with three children. Add native buttons for front and side views. Set absolute target positions on reset rather than subtracting earlier movements; repeated reset must give the same result.
Common mistake
Applying the same movement independently to every child scatters one intention across several places. Use a shared parent when the objects genuinely belong to one moving assembly.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Build a hierarchy
Place the ring and sphere inside a group located at the garden’s center. A child’s position is relative to its parent. Rotating the group moves both children around the group’s origin, while rotating the sphere changes its own orientation around its local origin.
02
Choose the pivot intentionally
To orbit a sphere around the center, offset the sphere inside a centered group and rotate the group. To spin the sphere in place, rotate the sphere itself. Combining these transforms creates different motion without manually recalculating every world coordinate.
03
Keep controls understandable
Provide separate Orbit and Spin controls and a reset. Show their current values in text. The hierarchy should make each control’s responsibility local, so changing the orbit does not unexpectedly move the entire garden or camera.
03 / MAKE SOMETHING
Your guided lab
Create independent orbit and spin behavior with a parent group.
Draw the scene hierarchy and annotate each local origin.
Offset a sphere inside a centered group and compare parent versus child rotation.
Add reset values and verify each control changes only its intended relationship.
What to produce
A scene graph diagram and a controlled pivot demonstration.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The orbit group stays centered while its sphere child is offset along X. Parent rotation changes the sphere’s world position; child rotation changes orientation without changing that offset. Reset restores both angles. The box can remain outside the group as a stable visual reference. This makes the transform distinction visible instead of relying on a sphere whose rotation may otherwise be difficult to perceive.
If something is not working
Orbit looks like an in-place spin
Check whether the child is offset from the parent origin.
The whole garden moves
Inspect which ancestor receives the transform.
Take it one step further
A child has local x = 2. Must its world x also equal 2?
Reveal the reasoning
No. Parent translation, rotation and scale contribute to its world transform. Local coordinates only describe its relationship to the parent.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
The whole sculpture must rotate around one center. Where does that rotation belong?
On a shared parent group
On each child with a separate local rotation
By moving each geometry’s vertices every frame
Reference answer
A. A shared parent expresses one movement for the complete assembly.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Fit the canvas without stretching the world
The canvas has a layout size and a drawing-buffer size. Treat them as related, separate decisions.
Measure the host
Measure the container that owns the canvas, not an assumed full browser width. Update the perspective camera aspect ratio from width divided by height, call updateProjectionMatrix, and update the renderer size. Guard against zero height when the container is hidden. Limit pixel ratio if necessary so a dense display does not create an unreasonable rendering workload.
Worked example
A square preview becomes a wide panel on desktop. Resizing only the CSS stretches the rendered sphere into an ellipse. Updating the camera projection as well as the renderer preserves its shape. A ResizeObserver can report changes caused by a sidebar opening even when the browser itself has not resized.
Practice
Place the scene in a resizable panel. Test square, wide and tall hosts, then hide and restore the panel. Compare a circle silhouette before and after each resize. Record the pixel-ratio cap you chose and the visual tradeoff.
Common mistake
Rendering at the maximum device pixel ratio everywhere spends pixels before establishing whether the extra detail is visible or useful. Measure on the intended device class.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Measure the host
A canvas can occupy a card, not the entire window. Read the actual host’s dimensions and update when that region changes. A window resize alone will miss layout changes caused by panels, tabs or other local allocations.
02
Keep two sizes distinct
CSS size describes displayed space; drawing-buffer size determines rendered pixels. Set the renderer size from the host and choose a bounded pixel ratio. High device pixel ratios increase pixel count quadratically, so matching every physical pixel can be unnecessarily expensive.
03
Update the projection
For a perspective camera, set aspect to width divided by height and updateProjectionMatrix. Skip rendering for zero-size hosts. Test a square and a wide rectangle; a sphere should remain round rather than stretching with the canvas.
03 / MAKE SOMETHING
Your guided lab
Make the garden adapt to a resizable host with a capped pixel ratio.
Observe host size changes and update renderer and camera in one resize function.
Test wide, tall and temporarily hidden hosts.
Compare visual quality and pixel count at ratios 1 and 2.
What to produce
A responsive scene with a documented resolution policy.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The resize function ignores zero dimensions, updates the renderer buffer without fighting the intended CSS layout, updates camera aspect and refreshes projection. A ResizeObserver follows the host. A cap such as 2 is a project choice to evaluate, not a universal optimum. The scene remains proportionate at each tested size, and hiding/showing its container does not leave a permanently invalid aspect ratio.
If something is not working
Objects look stretched
Update camera aspect and projection alongside the renderer.
A hidden panel produces invalid values
Guard zero dimensions and resize when the host becomes visible.
Take it one step further
Does doubling pixel ratio merely double the pixel count?
Reveal the reasoning
No. It doubles both buffer dimensions, producing roughly four times as many pixels. Evaluate the visual benefit against the rendering cost.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A sphere stretches after the host becomes wider. What was likely missed?
The sphere’s material roughness
The camera aspect and projection update
The scene’s background color
Reference answer
B. CSS stretching alone does not update the perspective projection.
LESSON 4 / 3 min read / 30 MIN PRACTICE
Give the scene a lifetime
An embedded scene should start, pause and stop as deliberately as any other interface component.
Control the loop
Use elapsed time for rotation rather than adding a fixed amount per frame. Provide a visible pause control and respect reduced-motion preferences with a static initial presentation. Keep native controls outside the canvas. Track the resources and listeners created by the scene so teardown can release them.
Worked example
Navigating between two previews mounts the garden repeatedly. If each mount leaves an animation loop behind, hidden scenes continue working. A destroy function stops the animation loop, disconnects observers, removes listeners and disposes the geometry, material and renderer that this instance owns. Shared resources need a separate ownership policy.
Capstone practice
Finish the garden, then mount and remove it three times in your development page. Verify that pause and reset still behave correctly and that the number of active callbacks does not grow. Include a text fallback for unavailable WebGL.
Review criterion
The scene is complete when it behaves well inside the page, including after resizing, pausing and removal. A beautiful first frame alone is not the acceptance test.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Own the resources
Track geometries, materials, textures, observers, listeners and the animation loop created by this scene. Removing a canvas from the DOM does not automatically release every GPU resource or callback. Shared resources need shared ownership so one scene does not dispose another’s assets.
02
Pause without losing meaning
Pause stops time-based change while leaving a useful composition and controls. Reset restores the documented camera and object state. When the page becomes hidden, suspend unnecessary continuous work and avoid applying an enormous elapsed time on return.
03
Provide a fallback
Catch renderer initialization failure and present a static representation plus an explanation of the unavailable interactive view. The scene’s title and purpose should exist in ordinary HTML. Dispose owned resources and observers when the view is removed.
03 / MAKE SOMETHING
Your guided lab
Finish the garden as a reusable mount/dispose component.
Add keyboard-operable Pause and Reset controls outside the canvas.
Unmount and remount repeatedly while checking loop and listener counts.
Exercise initialization failure and confirm the fallback communicates the scene.
What to produce
A complete scene lifecycle with controls, fallback and teardown evidence.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Mount creates one renderer and one loop. Pause changes simulation activity; Reset restores known values. Dispose stops scheduling, disconnects the observer, removes listeners and releases only owned resources. The fallback remains understandable without WebGL. Repeated mounting should not multiply animation callbacks. Document the tested browser and context support instead of claiming every device can run the scene.
If something is not working
Remounting makes animation faster
Look for multiple live loops or duplicated listeners.
The fallback is an empty rectangle
Supply a static composition and ordinary text describing its purpose.
Take it one step further
Is removing the canvas sufficient cleanup?
Reveal the reasoning
No. Stop callbacks, detach observers/listeners and dispose owned GPU resources. DOM removal and resource lifetime are related but separate responsibilities.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What should teardown dispose?
Every shared resource in the application
Resources owned by this scene instance
Only the canvas element, leaving the loop running
Reference answer
B. Ownership matters: releasing a shared resource can break another scene.
Capstone project
Create a tiny sculpture garden from a box, sphere and ring. Compose a clear silhouette, offer native buttons to change the viewpoint, and provide pause and reset controls. Keep a text description available when the 3D canvas cannot be used.
Build a static scene with a visible camera composition.
Add responsive sizing, viewpoint controls and optional rotation.
Test pause, reset, resize, fallback and teardown.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Compose three objects with intentional position and scaleEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Update camera aspect and renderer size when the container changesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use time-based animation with a pause controlEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep essential instructions and controls outside the canvasEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Stop the loop, remove listeners and dispose owned resources on teardownEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Build a controlled lighting study and learn to distinguish material decisions from lighting and color-management errors.
For: Creative developers who can already render and resize a Three.js scene. Before you begin: A working Three.js scene, basic geometry and camera controls. Three.js 0.186.0. Your outcome: A three-material sculpture study with two lighting setups and documented visual tradeoffs.
13 min reading · 120 min labs · 150 min project. Planning estimates.
Course map
Read the surface — Distinguish shape, material and illumination.
Direct the image — Create atmosphere while retaining a trustworthy reference.
LESSON 1 / 3 min read / 30 MIN PRACTICE
Change one variable at a time
A convincing material study starts with a controlled comparison.
Establish a reference
Use the same geometry and camera for every specimen. Give the object enough curvature to reveal a highlight and a broad face to reveal color. Begin with a neutral background and one clear key light. Record the starting values before changing the mood; otherwise every attractive result becomes difficult to reproduce.
Worked example
Three identical rounded objects are labeled ceramic, metal and rubber. When their shapes and framing differ, it is impossible to tell whether the impression comes from the surface or the silhouette. Reusing one geometry turns the comparison into a useful experiment. Keep an unedited reference specimen beside each variation.
Practice
Make a three-column study using one mesh geometry. Change only roughness across the columns, then make a second row changing only base color. Describe the visual evidence for each difference without using “more realistic” as the entire explanation.
Common mistake
Changing light intensity, exposure and material color simultaneously can make a pleasant image, but it does not teach you which parameter caused the improvement.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Hold the specimen constant
Use three identical rounded or curved specimens with the same scale and orientation. Give them neutral ceramic, metal and rubber-like starting materials. Different geometry would change highlights and make the comparison harder to interpret.
02
Change one property
Keep lighting fixed while varying roughness. Then restore it and compare metalness. These properties describe different aspects of the shading model; they are not interchangeable controls for making something look more expensive.
03
Record the setup
Save camera, lights, environment and material values with each capture. A material screenshot without its lighting context is incomplete evidence. A dark metal may reflect a dark environment rather than being incorrectly colored.
03 / MAKE SOMETHING
Your guided lab
Build a three-specimen comparison under one recorded lighting setup.
Use identical geometry and camera distance for all specimens.
Run a roughness sweep while holding other values constant.
Repeat with metalness and annotate the visible differences.
What to produce
A comparison board with reproducible values and observations.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The roughness sweep broadens and softens reflected highlights as roughness rises, while the metalness comparison changes the material’s diffuse/specular relationship. Keep the environment constant so those observations have meaning. If metal appears black, inspect what it has to reflect before increasing arbitrary light intensity. The board should explain a relationship, not merely label three attractive screenshots.
If something is not working
Every specimen has a different shape
Normalize geometry before judging material differences.
Metal looks empty or black
Review the environment and illumination available for reflection.
Take it one step further
Why is a material preset incomplete without a lighting context?
Reveal the reasoning
Its appearance depends on the light and environment it reflects. The same parameters can look very different in another scene.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which comparison isolates a material change?
Different geometry, camera and lighting
Identical geometry and lighting with one changed surface property
Three unrelated screenshots
Reference answer
B. A controlled scene makes the changed property interpretable.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Read the highlight, not just the color
The shape and spread of a reflection communicate a surface’s character.
Surface controls
MeshStandardMaterial uses metalness and roughness. Begin non-metal specimens at metalness 0 and a metal specimen at 1. Adjust roughness while observing the highlight. A metal needs something useful to reflect; a dark appearance may be an environment problem rather than a reason to increase base color indefinitely.
Worked example
The ceramic specimen has a relatively concentrated highlight while the rubber specimen spreads it. Both remain non-metallic. The metal specimen reflects the lighting environment differently. These are art-directed interpretations, not measurements of real manufactured materials. Keep your labels honest about that distinction.
Practice
Use the code values as starting hypotheses. Move the light without changing the surface, then restore it and change roughness. Save a comparison sheet describing which visual cue helped you distinguish the changes.
Common mistake
Using metalness as a general “shininess” slider confuses two different properties. Start from the type of surface, then tune its reflection spread.
const ceramic = new THREE.MeshStandardMaterial({
color: 0xd9bda4, metalness: 0, roughness: 0.3
});
const rubber = new THREE.MeshStandardMaterial({
color: 0x343d38, metalness: 0, roughness: 0.85
});
const metal = new THREE.MeshStandardMaterial({
color: 0xaaaaaa, metalness: 1, roughness: 0.35
});
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Inspect the highlight
A highlight describes both surface response and the light or environment reflected by it. On a curved specimen, its width and transition help reveal roughness. A bright patch alone does not tell you whether the material is metallic.
02
Move one source
Keep the material fixed and move the key light or switch between two known environments. Observe how the highlight travels across the form. If the supposed surface detail stays fixed to the screen, inspect whether it is actually a compositing or texture artifact.
03
Preserve useful contrast
A fully clipped highlight can hide the very detail you are comparing. Review exposure and tone mapping consistently across specimens. Do not change exposure separately for each material and then present the images as a controlled comparison.
03 / MAKE SOMETHING
Your guided lab
Annotate a material specimen under two lighting directions.
Mark highlight center, width and transition on each capture.
Hold material values fixed while moving the light.
Choose a shared exposure that preserves useful highlight detail.
What to produce
A two-lighting comparison explaining what changed and what stayed constant.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The annotation connects highlight movement to the lighting direction and highlight softness to the surface response under that setup. It acknowledges that the observed width also depends on the source. A shared exposure keeps the comparison credible. The final ceramic, metal and rubber specimens should differ through deliberate material choices while remaining readable in the same visual environment.
If something is not working
All highlights are flat white
Review exposure, source intensity and tone mapping together.
A lighting change is described as a material change
Keep a settings log and separate the variables.
Take it one step further
Can a broad highlight prove high roughness by itself?
Reveal the reasoning
No. Source size and environment structure also influence the highlight. Compare under controlled illumination before attributing the difference to roughness alone.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A dark metal has little visible reflection. What is worth inspecting first?
The lighting environment
Increasing metalness beyond its normal range
Increasing base color before inspecting the reflections
Reference answer
A. A reflective surface needs a useful environment to reveal its form.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Keep color roles explicit
A texture can represent visible color or numerical surface information; those are different inputs.
Audit the pipeline
Label every texture by its role before loading it. Color images and roughness data should not be treated interchangeably. Check the renderer output configuration and any postprocessing output step. Avoid adding a second color conversion simply because the result looked brighter. Keep a plain reference render to compare against the processed version.
Worked example
A material changes appearance after adding a postprocessing chain. Before retuning all its colors, compare the output conversion and tone-mapping steps. If the discrepancy belongs to the pipeline, changing every material creates compensating errors that will reappear in another scene.
Practice
Write a small asset table: filename, role, color-space setting and owning component. If you use no textures, document the output path instead. Compare a neutral reference and a saturated patch with and without your effects chain.
Common mistake
A correction made only by eye in one scene can hide a pipeline inconsistency. Fix the source of the discrepancy, then return to the creative material decision.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Distinguish meanings
A base-color image contains color information intended for visual interpretation. A roughness map or normal map contains numeric data. Treating every texture as display color changes the numbers used by the material and can produce incorrect shading.
02
Follow the rendering pipeline
Three.js uses a linear working color space for calculations and an output conversion for display. Mark color textures with their appropriate color-space metadata. Keep non-color maps as data. Check the pinned version’s defaults rather than copying an older snippet blindly.
03
Compare a known reference
Use a simple color patch and a neutral roughness map with a known value. Compare a material using the numeric parameter against one using the corresponding map. A controlled reference is more diagnostic than an arbitrary photograph with unknown processing.
03 / MAKE SOMETHING
Your guided lab
Audit texture roles in the three-material scene.
List every texture and classify it as color or numeric data.
Set color-space metadata deliberately for the color assets.
Compare a known roughness value against a map representing that value.
What to produce
A texture-role table and corrected material setup.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Base-color and emissive artwork are treated as color assets when authored in that space; roughness, metalness and normal maps remain data. The renderer’s output conversion is configured consistently for the pinned environment. The report records the role and source of each asset. It avoids applying color conversion repeatedly to “fix” a visual mismatch whose cause may instead be lighting or exposure.
If something is not working
A roughness map behaves unexpectedly
Check whether color-space conversion was incorrectly applied to numeric data.
Colors change after adding postprocessing
Inspect where output conversion and tone mapping occur in the pipeline.
Take it one step further
Should a grayscale roughness image automatically be marked as sRGB because it is an image file?
Reveal the reasoning
No. Its role is numeric data, not display color. File format alone does not determine the correct color-space treatment.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A scene changes color after postprocessing is added. What should you inspect before repainting all materials?
The output conversion pipeline
Retuning every material independently
The object positions only
Reference answer
A. A pipeline change can alter every material; compensating per material hides the cause.
LESSON 4 / 3 min read / 30 MIN PRACTICE
Light a story with a budget
Lighting should guide attention while remaining practical for the page that contains it.
Choose a visual intention
Name the intended mood in observable terms: a crisp silhouette against a quiet background, or a broad soft highlight that reveals curvature. Build two setups from that intention. Introduce shadows only where they clarify contact or depth; review their cost and artifacts at the actual display size.
Worked example
The gallery setup uses a restrained background and broad readable highlights. The evening setup introduces a warm key and darker surroundings, but the object’s edge remains legible. A “dramatic” version that hides the subject fails the purpose of a material comparison.
Capstone practice
Finish the three specimens and two lighting presets. Add keyboard-operable preset buttons and a static fallback image or description. Compare rendering cost and visual quality at the intended canvas size, then document a lower-cost setting.
Review criterion
A viewer should see both the difference between materials and the intention behind each lighting setup. Include the reference configuration so another developer can reproduce the comparison.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
State the lighting story
Create a soft gallery preset for inspection and a directional evening preset for atmosphere. Each has a purpose. The gallery reveals surfaces; the evening preset creates a focal relationship without making controls or essential objects disappear.
02
Budget the expensive work
Add lights and shadows only when they improve the scene’s reading. Shadow maps and large buffers have costs. Compare a simpler setup against the elaborate one before assuming every additional light is necessary.
03
Make switching predictable
Use a native control to switch presets and preserve material settings, camera and object transforms. If a transition is animated, offer a direct reduced-motion change. The comparison should make lighting’s contribution visible rather than changing the entire scene at once.
03 / MAKE SOMETHING
Your guided lab
Finish a material gallery with two labeled lighting presets.
Write the purpose and settings of each preset.
Compare a reduced-light version and retain only useful contributions.
Test preset switching, reduced motion and material readability.
What to produce
An interactive material gallery with settings, budget and comparison evidence.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The same ceramic, metal and rubber specimens remain identifiable in both presets. The gallery mode supports close inspection; evening mode uses directional emphasis while retaining form. Preset switching updates only lighting-related state. The budget names light/shadow choices and observed performance under a stated device profile, without promising a universal frame rate.
If something is not working
The dramatic preset hides the subject
Restore enough form information or reconsider the focal arrangement.
Preset switching changes materials too
Separate lighting state from material state.
Take it one step further
When is removing a light a successful improvement?
Reveal the reasoning
When the scene preserves its intended readability and mood while reducing work. Judge the visual task and measured cost together.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What justifies adding a shadow?
It is always free
It improves a specific depth or contact cue enough to justify its cost
Every object must have one
Reference answer
B. Treat a shadow as a visual decision with a rendering cost.
Capstone project
Create a material comparison with ceramic, brushed-metal and matte-rubber interpretations of the same object. Use identical camera framing, two named lighting setups and an HTML control to switch between them. Document which parameters changed and why.
Build a neutral reference scene and material grid.
Create two lighting compositions without changing geometry.
Review highlights, silhouette and color consistency; write a short calibration note.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Compare materials on the same geometry and cameraEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Separate metalness, roughness and color decisionsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use a stable lighting reference before art directionEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep color and non-color texture roles explicitEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Explain quality and performance tradeoffs without claiming physical measurementEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Turn coordinates and distance fields into an original procedural poster with controlled motion and a static alternative.
For: Creative developers ready to write fragment shaders rather than assemble effects. Before you begin: JavaScript, vectors, basic algebra and a working WebGL or Three.js shader host. Your outcome: A responsive procedural poster with parameter controls, a tested shader and a reduced-motion composition.
14 min reading · 120 min labs · 180 min project. Planning estimates.
Course map
Coordinates into form — Build shapes from measurable distance.
Form into a system — Introduce repetition, parameters and purposeful motion.
LESSON 1 / 3 min read / 30 MIN PRACTICE
Make the coordinate system visible
Before drawing a complex effect, draw a map of the space in which it will exist.
Normalize deliberately
gl_FragCoord describes the fragment in drawing-buffer pixels. Divide by a resolution uniform to obtain a normalized coordinate. Center it around zero, then compensate for aspect ratio so equal distances remain equal on screen. Keep the resolution uniform synchronized with the actual drawing buffer, especially on dense displays.
Worked example
A circle calculated directly in 0–1 coordinates becomes an ellipse on a wide canvas. Scaling the horizontal centered coordinate by width divided by height makes a distance of 0.2 correspond to the same screen distance in either direction. This defines a useful unit based on canvas height.
Practice
First output the normalized coordinates as red and green channels. Identify the corners and center. Then draw a circle at the center and test square, tall and wide canvases. Describe exactly what a unit means after your aspect correction.
Common mistake
Using CSS dimensions for a shader that reads drawing-buffer pixels can introduce a mismatch. Inspect the actual buffer dimensions and pass those to the uniform.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Start with a coordinate image
Map horizontal position to red and vertical position to green. This reveals origin, orientation and continuity across the drawing surface. A coordinate gradient is a debugging instrument, not merely a decorative first shader.
02
Center and scale
Convert coordinates into a centered space, then account for width/height so one unit represents comparable distances along both axes. Otherwise a circle defined mathematically becomes an ellipse when the canvas is rectangular.
03
Keep resolution current
Pass the actual drawing-buffer resolution used by the shader and update it when the buffer changes. CSS dimensions and buffer dimensions may differ. Inconsistent coordinates can make pointer interaction or shape size drift at high pixel ratios.
03 / MAKE SOMETHING
Your guided lab
Render a coordinate gradient and a centered circle on square and wide canvases.
Show the raw coordinate gradient and annotate its origin.
Apply aspect correction and compare the circle before and after.
Resize the canvas and update the resolution uniform.
What to produce
A diagnostic coordinate mode and a proportionate shape at two aspect ratios.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The red/green gradient exposes the coordinate orientation, while the centered aspect-corrected coordinates keep the circle round. The resolution uniform follows the actual buffer dimensions. Keep a debug toggle for the gradient; it can reveal later mapping errors quickly. A shader that looks correct only on a square has not yet established a reliable coordinate system.
If something is not working
The circle stretches with the canvas
Apply aspect correction in the coordinate space used for distance.
Pointer and shape positions disagree
Convert pointer coordinates into the same origin and units as the shader.
Take it one step further
Why inspect coordinates before adjusting colors and effects?
Reveal the reasoning
Many visual defects originate in mapping rather than styling. A visible coordinate field makes orientation, scale and aspect mistakes directly observable.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Why correct the centered x coordinate by width/height?
To preserve screen-space proportions
To increase the drawing-buffer resolution
To normalize the radius by width a second time
Reference answer
A. The correction makes the distance field use equal physical scale on both axes.
LESSON 2 / 5 min read / 30 MIN PRACTICE
A shape is a distance decision
A signed distance field gives you more than a binary inside-or-outside mask.
Measure from the boundary
For a centered circle, length(p) minus radius is negative inside, zero at the edge and positive outside. Use this value to create a fill, an outline or a soft boundary. Keep softness tied to the intended display scale; an arbitrary large feather can erase the character of the shape.
Worked example
The fragment shader below uses a circular field and a narrow smooth transition. It is a WebGL 1 style fragment shader for a compatible host; the host must supply u_resolution and a full-screen triangle. It is not a complete HTML application. A Three.js ShaderMaterial can supply the surrounding vertex stage.
Practice
Change the radius, then turn the filled circle into a ring using abs(distance). Compare a thin outline at two canvas sizes. Inspect shader compile logs after each structural edit, and keep the last working version.
Common mistake
Reversed smoothstep edges are not a portable way to invert a mask. Keep the lower edge first and subtract the result from 1 when you want the opposite mask.
For a circle centered at the origin, length(p) minus radius is negative inside, zero on the boundary and positive outside. This signed distance gives a reusable geometric description before choosing fill, outline or softness.
02
Choose the mask
A hard threshold creates a crisp binary mask but can alias. A narrow smoothstep interval softens the transition. Keep the interval edges ordered correctly; reverse the output when needed rather than relying on reversed smoothstep edges.
03
Compare scales
An edge width expressed in coordinate units changes its apparent pixel width with resolution and scale. For this introductory exercise, derive an approximate one-pixel interval from the buffer height used to scale these coordinates, then inspect the result at multiple sizes.
glsl / worked fragment
precision mediump float;
uniform vec2 u_resolution;
void main() {
vec2 p = gl_FragCoord.xy / u_resolution - 0.5;
p.x *= u_resolution.x / u_resolution.y;
float radius = 0.28;
float thickness = 0.02;
float d = length(p) - radius;
float edge = 1.0 / u_resolution.y;
float fill = 1.0 - smoothstep(-edge, edge, d);
float ring = 1.0 - smoothstep(thickness - edge, thickness + edge, abs(d));
// Use fill instead of ring below to compare the filled shape.
vec3 paper = vec3(0.94, 0.88, 0.75);
gl_FragColor = vec4(mix(paper, vec3(0.85, 0.18, 0.09), ring), 1.0);
}
03 / MAKE SOMETHING
Your guided lab
Create a filled circle and a ring from the same signed distance.
Render the distance as a diagnostic grayscale field.
Create a fill mask and an outline using absolute distance.
Compare edge quality at two buffer sizes and document the smoothing choice.
What to produce
A shader with distance, fill and outline modes.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The fill uses one minus smoothstep across a narrow interval around zero. The ring thresholds the absolute distance around a chosen thickness. Both reuse the same circle definition, so changing radius updates them coherently. The smoothing interval is positive and ordered. Keep shape logic separate from palette selection so visual tuning does not obscure the geometry.
If something is not working
The boundary is noisy or jagged
Inspect resolution and the transition interval before adding blur elsewhere.
The mask behaves inconsistently
Check smoothstep edge order and invert its result explicitly.
Take it one step further
What does a negative signed distance mean in this circle model?
Reveal the reasoning
The point lies inside the circle. That sign lets you derive fills and outlines without separately encoding the shape for each visual treatment.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What does a negative circle distance indicate?
A fragment inside the circle
A fragment outside the circle
A point exactly on the boundary
Reference answer
A. The sign identifies the side of the boundary.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Repeat a rule, then break it intentionally
Repetition creates a system; controlled variation gives that system a point of view.
Separate frequency and phase
A repeating stripe can depend on a coordinate multiplied by frequency and shifted by phase. Frequency changes how many bands appear; phase moves the pattern without changing its density. Keep these controls independent so you can explain a visual revision. Very dense patterns may shimmer when sampled by the screen.
Worked example
The poster places broad bands behind a circle. Increasing frequency from six to sixty creates distracting interference near the edge. Reducing density improves the composition more effectively than adding blur everywhere. A single interrupted band creates a focal event while the rest of the field establishes rhythm.
Practice
Make three still studies with identical colors but different band frequency. Choose one based on hierarchy and legibility at the smallest display size. Add a labeled phase control and confirm that it changes position rather than accidentally changing scale.
Common mistake
More mathematical complexity does not automatically produce a stronger image. Keep a plain version available so each new rule has to justify its contribution.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Repeat a coordinate domain
Scale the coordinate, use floor to identify the cell and fract to locate a point inside it. Center the local coordinates before applying a shape function. Cell identity controls variation; local coordinates describe the repeated shape.
02
Introduce a bounded exception
Use one deterministic rule to change selected cells: alternate radius by row or reserve a clear title band. Randomizing every property independently often destroys the rhythm that made repetition useful. Keep the exception connected to the poster’s hierarchy.
03
Inspect seams
Shapes touching cell boundaries can create visible discontinuities or clipping. Decide whether that is intentional. Test the outer canvas edges and the reserved text region as well as the central pattern. The composition needs a useful place for actual information.
03 / MAKE SOMETHING
Your guided lab
Build a repeated-circle poster with a protected title region and one variation rule.
Display cell IDs and local coordinates in temporary debug modes.
Choose one alternating or seeded variation with bounded values.
Reserve a title band and inspect edge cells at different aspect ratios.
What to produce
A patterned poster whose repetition and exception are both explainable.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The grid supplies rhythm, a restrained radius change creates variation and the title region remains quiet enough to read. Cell ID determines which variation applies, while local coordinates determine the circle’s geometry. The final composition intentionally crops or contains edge cells. It does not depend on a single canvas ratio to keep text clear.
If something is not working
Every resize produces chaotic changes
Separate stable cell identity from dimensions and document the intended adaptation.
Text fights the pattern
Reserve an actual compositional region instead of hoping contrast will solve density.
Take it one step further
Why should cell ID and local coordinates be separate variables?
Reveal the reasoning
They answer different questions: which repeated unit this is, and where a fragment lies inside that unit. Mixing them makes controlled variation and debugging harder.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which parameter moves an existing pattern without changing its density?
Phase
Frequency
Amplitude
Reference answer
A. Phase offsets a repeated pattern; frequency changes the number of repetitions.
LESSON 4 / 3 min read / 30 MIN PRACTICE
Give time a compositional purpose
An animated poster needs a coherent still frame as well as a pleasant loop.
Animate a meaningful parameter
Choose one main change, such as the phase of the bands or the radius of a shape. Use elapsed time in seconds, not frame count. Define a static phase that preserves the composition when motion is paused or reduced. Controls should remain normal HTML so keyboard users can operate them.
Worked example
The circle stays fixed while the bands move slowly behind it, revealing a contrast between stability and flow. Animating every property at once removes that relationship. A pause button freezes a deliberate composition, while reset restores the same parameter values every time.
Capstone practice
Deliver the poster with two parameter controls, a static mode and a short description of its rules. Test shader compilation, resize and a context failure path. Capture a still at the narrowest intended size and explain the strongest compositional decision.
Review criterion
The result should remain recognizable as the same design across sizes and motion preferences. Treat a shader error as a visible fallback state, not an empty unexplained rectangle.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Assign time a job
For the poster, time can slowly shift a band or breathe a shape radius. Choose one dominant change that supports the composition. Multiplying unrelated sine waves can create activity without a readable focal relationship.
02
Keep controls bounded
Expose speed, intensity and Pause as native controls with meaningful ranges. Clamp the values entering the shader. A speed of zero should create a stable composition, and Reset should restore a documented frame rather than an arbitrary elapsed moment.
03
Support interruption
Pause accumulation instead of resetting the clock every frame. Respect reduced motion with a useful static default and explicit opt-in if appropriate. Handle context failure with a static poster so the message survives without the effect.
03 / MAKE SOMETHING
Your guided lab
Finish the shader poster with speed, intensity, Pause and Reset controls.
Choose one animated relationship and explain its compositional purpose.
Test zero speed, maximum allowed intensity and pause/resume.
Review the static/reduced-motion view and initialization fallback.
What to produce
An interactive shader poster with a readable static equivalent and control contract.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Time drives one deliberate variation, intensity remains bounded and Pause freezes the current frame. Reset restores the chosen composition and control values. The title and explanation stay in HTML rather than becoming inaccessible pixels. Reduced motion reveals a complete poster immediately. The fallback communicates the same theme even when interactive rendering is unavailable.
If something is not working
Pause resumes with a large jump
Accumulate active time rather than using an unadjusted wall-clock difference.
The static view loses the subject
Design a meaningful resting composition before adding movement.
Take it one step further
Should essential text be readable only during one phase of the animation?
Reveal the reasoning
No. Essential information needs a stable, accessible presentation. Animation can enrich the composition without becoming a timed gate to understanding it.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What should reduced-motion mode provide?
A deliberate static composition
A blank canvas
Faster animation
Reference answer
A. The visual story should remain available without continuous movement.
Capstone project
Create an original procedural poster using a circle distance field, repeated bands and a limited palette. Expose scale and phase through labeled HTML controls. Include a static composition, aspect-ratio correction, shader compilation checks and an explanation of the coordinate system.
Render coordinates and one shape before adding motion.
Compose repeated forms and a limited color system.
Add controls, static mode and narrow/wide canvas tests.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Explain each coordinate transformationEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep circles circular across canvas shapesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Control edges and band frequency deliberatelyEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use uniforms for time and user parametersEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Provide a static mode and handle shader compilation failure visiblyEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Build an interactive field of repeated forms with stable simulation, reproducible variation and a measured rendering budget.
For: Developers comfortable with Three.js transforms and JavaScript animation. Before you begin: Three.js scene lifecycle, vectors and arrays. Three.js 0.186.0. Your outcome: A seeded interactive particle field with bounded motion, instancing and a quality control.
13 min reading · 120 min labs · 180 min project. Planning estimates.
Course map
Many objects, one system — Separate simulation data from rendering objects.
Control the energy — Bound interaction and measure rendering cost.
LESSON 1 / 3 min read / 30 MIN PRACTICE
Design the field before increasing the count
A particle system is a composition made from a rule, not simply a large number.
Choose the distribution
Decide where objects are allowed to begin and what larger shape they create together. Store initial positions separately from current positions so reset and return forces have a stable target. Use a seeded generator when you need the same arrangement for debugging or art direction.
Worked example
Four hundred objects occupy a gently bent grid. Small seeded offsets soften the rows without destroying their structure. The grid supplies visual order; the offsets supply variation. Starting from unconstrained randomness makes it harder to see whether an interaction returns the field to a coherent state.
Practice
Sketch a field with twenty points before writing the full system. Compare a grid, ring and clustered distribution. Choose one and state the rule precisely. Save its seed and verify that reloading reconstructs the same coordinates.
Common mistake
Regenerating random positions every frame creates flicker rather than a simulation. Randomness should usually establish stable properties that evolve through a separate movement rule.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Sketch the distribution
Use a bounded field of points with a quieter center or a deliberate cluster. Decide what the viewer should notice first. Four hundred particles distributed thoughtfully can communicate more clearly than thousands scattered without hierarchy.
02
Separate count from density
Increasing count in the same area changes density and overlap. Increasing the area at the same time changes apparent scale. Compare one variable at a time and keep the camera fixed while judging the field.
03
Make the fixture repeatable
Use a seeded random generator for initial positions and store the seed. Rebuilding with the same settings should produce the same arrangement, allowing a fair comparison of particle size or lighting.
03 / MAKE SOMETHING
Your guided lab
Compose a seeded 400-particle field with a clear focal region.
Sketch the intended density and empty-space pattern.
Generate bounded positions and record the seed.
Compare two particle sizes without changing the distribution.
What to produce
A repeatable particle composition with a visual rationale.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The seed recreates the field, the bounds keep particles within the intended composition and the focal region remains readable. The selected particle size balances visible form against overlap. A count increase is justified only after the composition works; it should not be used to conceal a lack of structure. Save the camera and seed with the comparison captures.
If something is not working
Every comparison changes the arrangement
Reset the same seed before generating each candidate.
The field is a uniform visual fog
Introduce deliberate density variation or negative space.
Take it one step further
Why keep the seed constant while comparing particle size?
Reveal the reasoning
It isolates size as the changed variable. Otherwise distribution differences can be mistaken for an improvement caused by scale.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
When should the initial random positions usually be generated?
At initialization or an explicit reset
Again for every rendered frame
Every time an individual particle changes direction
Reference answer
A. Stable initial data lets motion evolve coherently and makes debugging reproducible.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Share the geometry; vary the transform
Repeated shapes can share rendering resources while retaining individual positions and scales.
Instance the repetition
InstancedMesh stores many transforms for shared geometry and material. Use a temporary Object3D to compose each transform, update its matrix, then pass that matrix to setMatrixAt. After changes, mark instanceMatrix.needsUpdate. Recompute bounds when transforms change enough to invalidate them; incorrect bounds can cause unexpected disappearance.
Worked example
The snippet creates a regular field using a supplied THREE import and scene. Every object shares one low-detail sphere and one material. The temporary transform object is reused instead of allocating a new one per particle per frame. The simulation can remain plain arrays independent of the mesh.
Practice
Render 400 instances and compare draw calls with 400 separate meshes in the same scene. Keep geometry, camera and material identical for a fair comparison. Record the actual result; fewer draw calls do not guarantee that every other cost disappears.
Common mistake
Instancing reduces repeated draw setup, but an expensive shader or excessive pixel coverage can still dominate. Measure the bottleneck you actually have.
const count = 400;
const field = new THREE.InstancedMesh(
new THREE.SphereGeometry(0.035, 8, 6),
new THREE.MeshNormalMaterial(), count
);
const transform = new THREE.Object3D();
for (let i = 0; i < count; i++) {
transform.position.set((i % 20) * 0.12 - 1.14, Math.floor(i / 20) * 0.12 - 1.14, 0);
transform.updateMatrix();
field.setMatrixAt(i, transform.matrix);
}
field.instanceMatrix.needsUpdate = true;
field.computeBoundingSphere();
scene.add(field);
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Share what is identical
An InstancedMesh shares geometry and material across many copies while storing individual transforms. This reduces draw-call overhead for compatible repeated objects. It does not remove the cost of shading every visible pixel or updating every matrix.
02
Write complete transforms
For each particle, set position, rotation and scale on a temporary Object3D, update its matrix, then copy that matrix into the instance. Reusing a helper requires resetting all relevant values so an earlier particle’s scale does not leak into the next.
03
Signal and bound updates
After changing matrices, mark instanceMatrix.needsUpdate. Keep bounding information consistent with motion so culling does not discard visible particles. Use a documented conservative bound or recompute when appropriate; do not assume initial bounds cover every later position.
03 / MAKE SOMETHING
Your guided lab
Replace separate particle meshes with one instanced mesh.
Share geometry/material and assign one complete transform per particle.
Mark matrix updates and inspect bounds during motion.
Compare draw calls and visual output under the same camera and seed.
What to produce
An instanced field with correct transforms and measured rendering evidence.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The instanced version preserves the same composition while reducing compatible draw calls. Each temporary transform is fully assigned before its matrix is copied. Matrix upload flags and bounds are maintained. The report distinguishes fewer draw calls from total frame cost: a large translucent field can remain expensive because of overdraw even after instancing.
If something is not working
Particles inherit strange scales
Reset every transform component on the reused helper.
Visible particles disappear near the edge
Inspect frustum culling and whether bounds cover the animated field.
Take it one step further
Does one instanced draw call guarantee inexpensive rendering?
Reveal the reasoning
No. Geometry complexity, pixel coverage, transparency and per-frame updates still cost work. Instancing addresses one class of overhead.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
After changing instance matrices, what signals the upload?
instanceMatrix.needsUpdate = true
Calling updateMatrix on the temporary object alone
Changing the camera projection only
Reference answer
A. The attribute must be marked for update after matrix changes.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Bound the force and the time step
An attractive field should not explode when the pointer approaches a particle or a frame arrives late.
Separate the simulation
Keep position, velocity and home position in data. A return force points toward home; damping removes energy. If a pointer force divides by distance, impose a minimum distance and cap the force. Use a bounded time step or substeps so a delayed frame does not produce one enormous jump.
Worked example
A pointer lands exactly on a particle. Dividing by zero distance creates an invalid velocity and the particle disappears. A minimum radius and a zero-distance direction policy prevent this. When a tab resumes after being hidden, cap the elapsed step rather than integrating the entire absence at once.
Practice
Inject a 250ms delayed frame and place the pointer exactly on a particle. Observe whether every position remains finite. Add a keyboard button that triggers the same bounded disturbance at the field center.
Common mistake
Clamping the displayed position while leaving an enormous velocity in the model hides the failure for one frame. Bound the cause and let damping dissipate energy.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Define the home state
Store each particle’s original position separately from its animated position. A return force pulls toward home; pointer influence displaces particles within a bounded region. Without a stable home reference, repeated interaction can make the field drift permanently.
02
Bound force and time
Normalize direction carefully and protect near-zero distances. Clamp pointer force so a particle under the pointer does not receive an extreme impulse. Use small integration steps with a maximum accumulated interval; a long inactive-tab gap must not become one enormous update.
03
Inspect recovery
Move the pointer rapidly, leave the canvas and pause/resume. Particles should settle toward their original composition without numerical explosions. Damping controls energy loss, but excessive damping should not be used to hide an unstable time step.
03 / MAKE SOMETHING
Your guided lab
Add a bounded pointer force and a damped return to the seeded field.
Keep immutable home positions and separate position/velocity arrays.
Clamp force and integrate in bounded substeps.
Test pointer overlap, rapid movement and a simulated long frame gap.
What to produce
A stable particle interaction with recorded force and time-step limits.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The pointer influence is finite even at very small distances, and each particle returns toward its stored home. A long frame interval is capped or subdivided according to a documented policy. The final test inspects both numerical values and the visible return. Pausing stops work while retaining a coherent field; resuming does not inject the entire hidden-tab interval.
If something is not working
Particles explode after tab switching
Reset timing on resume and bound integration intervals.
The field never returns
Preserve home positions and inspect damping and return-force direction.
Take it one step further
Why is increasing damping alone an incomplete fix for an oversized time step?
Reveal the reasoning
The numerical update can remain unstable or inaccurate. Control the integration interval first, then tune damping for the intended behavior.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Why test a pointer exactly on a particle?
To expose zero-distance force singularities
To prove the pointer event fires often enough
To measure how many draw calls instancing saves
Reference answer
A. Distance-based formulas need a deliberate zero-distance policy.
LESSON 4 / 3 min read / 30 MIN PRACTICE
Measure the illusion at two quality levels
The strongest system preserves its character when the device cannot afford every detail.
Define the essential image
Decide whether density, silhouette or response softness makes the field recognizable. Reduce a less important cost first: object detail, pixel ratio or count. Compare the same seeded scene and interaction under the same conditions. Report the device, viewport and measured metric alongside the result.
Worked example
A lower-density mode uses 200 objects but preserves the overall bent-grid shape and disturbance radius. It still feels like the same piece. Randomly removing half the field on every frame would reduce count while destroying continuity. A static mode retains the composition without running the simulation.
Capstone practice
Deliver the field with two density settings, a seeded reset, pause and keyboard disturbance. Record frame-time samples for both modes, including your measurement conditions. Verify that changing density releases unused resources and does not accumulate listeners.
Review criterion
Explain one measured tradeoff and one preserved visual intention. Avoid claiming a universal frame rate from a single computer.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Choose meaningful levels
Use 400 and 200 particles from the same seeded distribution, with a consistent camera and focal region. A quality switch should reduce work while retaining the design’s identity. Reducing pixel ratio may matter more than count when fill cost dominates.
02
Measure under stated conditions
Compare frame observations, draw calls and buffer size on the same device and route. Record interaction and idle behavior separately. A smooth desktop result does not establish the same performance on every mobile device.
03
Complete the lifecycle
Pause continuous work when unnecessary, expose a native quality selector and release owned resources on disposal. A reduced-motion/static presentation should retain the field’s visual purpose without requiring pointer-driven movement.
03 / MAKE SOMETHING
Your guided lab
Deliver the particle field with two quality modes and a static alternative.
Compare both counts with the same seed and camera.
Measure the effect of count and buffer resolution separately.
Test quality switching, pause, reduced motion and repeated mount/dispose.
What to produce
A particle experience with quality controls, fallback and an honest performance report.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The lower setting keeps the composition recognizable and reduces a measured source of work. Switching does not leak old meshes or create additional loops. The report states the device and conditions and avoids promising a universal frame rate. Static mode presents the same field without simulation, so reduced motion changes activity rather than removing the subject.
If something is not working
Lower count barely improves timing
Inspect fill cost, pixel ratio and other frame work.
Each quality change consumes more resources
Dispose replaced owned resources and reuse compatible allocations.
Take it one step further
Which quality control should you prioritize if overdraw dominates the trace?
Reveal the reasoning
Investigate pixel coverage, transparency and drawing-buffer resolution. Particle count may help, but the measured bottleneck should guide the control.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What makes a quality comparison interpretable?
Changing every variable at once
The same seed, view and interaction with documented conditions
Only a subjective score
Reference answer
B. Controlled conditions make the measured difference meaningful.
Capstone project
Create a field of 400 small repeated objects that respond to a pointer and settle back into a recognizable arrangement. Add a keyboard-triggered disturbance, pause/reset controls and a lower-density mode. Record the seed and a measured frame-time comparison.
Build a static seeded arrangement.
Introduce bounded forces and efficient transform updates.
Test delayed frames, controls and two density budgets.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Use one shared geometry and material where appropriateEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Reproduce the same initial arrangement from a seedEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Update instance matrices and bounds correctlyEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep simulation stable after a delayed frameEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Offer keyboard disturbance, pause and a measured density optionEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Turn a sequence of ideas into a readable scroll narrative with deliberate transitions and a complete static version.
For: Designers and developers who already build responsive pages. Before you begin: Semantic HTML, CSS layout and basic JavaScript events. Your outcome: A three-chapter narrative with measured progress, clear transitions and no dependency on motion for meaning.
14 min reading · 120 min labs · 150 min project. Planning estimates.
Course map
Write the sequence — Give movement a narrative job.
Choreograph the journey — Map progress while preserving reader control.
LESSON 1 / 4 min read / 30 MIN PRACTICE
Write the page before animating it
A scroll story needs a sequence of ideas that works even when every frame is still.
Assign each chapter a job
Write the question a chapter answers and the new information it adds. Avoid three sections that repeat the same promise at increasing scale. Place the essential text in the document, with meaningful headings and links. Motion can reveal a relationship, but should not be the only way to obtain the information.
Worked example
The seed-library story begins with collecting varieties, moves to exchanging them, then ends with the next season’s growth. One seed becomes many packets and later a living pattern. Each transformation corresponds to a real change in the story, rather than an arbitrary visual trick between unrelated paragraphs.
Practice
Write three chapter summaries of no more than forty words each. Underline the new idea in each. Build a plain HTML version and ask someone to retell the sequence without seeing any animation. Revise unclear transitions before opening a timeline editor.
Common mistake
A page that only makes sense when read at one precise scroll speed is fragile. The reader may skip, reverse, use search or arrive at a deep link.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Choose a reader journey
The fictional seed library has three chapters: collect local seeds, exchange a packet and return the next season’s harvest. Each chapter answers a different practical question. Write the headings and instructions in a meaningful document order before designing transitions.
02
Give each chapter a job
Collect explains what to label; exchange explains how to choose and record a packet; regrow explains when to return seeds. A repeated decorative heading would not advance the story. Use one concrete example, such as a clearly labeled bean packet, to connect the stages.
03
Make navigation ordinary
Use real headings and anchor links. The reader should be able to jump to regrow, select text and use browser navigation. Essential instructions must not depend on a canvas frame, a timed reveal or a scroll position that assistive technology cannot reach.
03 / MAKE SOMETHING
Your guided lab
Write and lay out the three-chapter seed-library story as a static page.
Give each chapter one reader question, one answer and one example.
Add a table of contents with native anchors.
Read the page without effects and remove repeated or missing information.
What to produce
A complete static narrative with three independently understandable chapters.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The bean packet connects the sequence without forcing someone to read every earlier section before finding practical guidance. Each heading describes an action, and anchors reach the relevant content directly. The static page already communicates the full story. Later motion can show continuity between the packet, exchange and growing plant, but it does not carry information absent from the text.
If something is not working
The story is only a sequence of slogans
Add concrete actions, examples and consequences.
A chapter makes sense only after an animation
Put its essential explanation into ordinary document content.
Take it one step further
Should a reader who jumps directly to the third chapter be forced back to the beginning?
Reveal the reasoning
No. Preserve their navigation choice and make the chapter understandable. Narrative continuity can enrich a linear reading without becoming a mandatory gate.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What should remain understandable without animation?
Only the logo
The complete essential story
Nothing after the first chapter
Reference answer
B. Motion enhances a narrative whose meaning is already available in the document.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Map a local interval into progress
Each scene needs an explicit beginning and end rather than a vague relationship to the whole page.
Normalize the interval
Choose scroll positions start and end for the scene, then map the current position into a 0–1 value. Clamp values outside the interval. Guard against a zero-length interval. Recalculate the geometry when layout changes, including image loading or viewport resizing, and separate measurement from per-frame visual updates.
Worked example
A packet opens between scroll positions 600 and 1400. At 1000, the local progress is 0.5. Scrolling backward naturally closes it because the visual state derives from progress rather than a one-time “play” event. The mapping below is a pure function you can test independently.
Practice
Write expected values before running the function: before start, at start, halfway, at end and beyond end. Test an invalid interval. Then map the value to a single transform and inspect reversal at every point.
Common mistake
Accumulating a transform on every scroll event makes the result depend on how many events fired. Derive the current state from current progress instead.
Decide when the chapter effect begins and ends, such as when the section’s top reaches the bottom of the viewport and when its bottom reaches the top. Other intervals are valid, but the formula and design must describe the same endpoints.
02
Normalize and clamp
Convert the measured position into a value from zero to one, then clamp it. A reusable pure function should handle before-start, midpoint, after-end and a degenerate interval. Keeping the mapping separate from rendering makes it easier to test.
03
Refresh geometry when needed
Images loading, font changes and responsive reflow can change section dimensions. Avoid assuming the initial measurements remain correct forever. Recalculate on relevant size changes and render from the latest geometry without creating repeated synchronous layout work.
03 / MAKE SOMETHING
Your guided lab
Implement and test progress for one chapter before animating it.
Write the exact start/end conditions in plain language.
Show progress as text and test before, within and after the interval.
Resize the content and verify the mapping updates.
What to produce
A documented progress function with boundary checks and a visible debug readout.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The debug readout shows 0 before the interval, 0.5 halfway through and 1 afterward. A zero-length interval follows an explicit policy rather than producing NaN. Geometry updates when the section changes size. The first implementation displays a number so mapping errors remain obvious; only after that evidence is sound should the value drive transforms.
If something is not working
The animation completes too early
Compare measured endpoints with the written interval.
Resizing shifts the timing unexpectedly
Refresh section measurements and inspect stale cached geometry.
Take it one step further
Why clamp progress before sending it to an opacity or transform mapping?
Reveal the reasoning
It defines stable states outside the active interval and prevents unintended extrapolation. Any deliberate overshoot should be a separate, explicit mapping choice.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
At y=1000 for start=600 and end=1400, what is progress?
0.25
0.5
1
Reference answer
B. The reader is 400 units into an 800-unit interval.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Stage the transition around attention
A transition should help the eye follow the idea that changed.
Choose an anchor
Keep one element or position stable while another changes. Introduce, transform and settle rather than moving every layer continuously. Reserve enough reading space after the transition so the audience can inspect the result. Avoid pinning so much content that a phone viewport becomes a cramped animation stage.
Worked example
The seed remains near the center while its surrounding packet opens. The next chapter introduces exchange lines after the packet has settled. Delaying the lines makes the causal sequence legible. On a narrow screen, the illustration sits above the text and uses a simpler fade or static state.
Practice
Storyboard five still frames: before, anticipation, change, arrival and rest. Label the element the viewer should notice first in each. Build the transition with transforms and opacity where suitable, then inspect the page while scrolling quickly and backward.
Common mistake
Long animation does not create narrative depth by itself. A reader waiting for an oversized transition to finish may lose the thread of the story.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Choose a focal change
In the seed story, a packet can transition into a planted row while the next chapter explains sowing. Keep the main text stable and readable. Moving the illustration, headline and body independently at once makes attention difficult to direct.
02
Use phases deliberately
Map early progress to establishing the packet, middle progress to the transition and late progress to the planted state. Hold each meaningful state long enough to understand. Avoid requiring the reader to stop at a single exact pixel to see the subject.
03
Separate reading from decoration
A sticky illustration can support the text while the document scrolls normally. Ensure it does not cover anchors or controls. On narrow layouts, a simpler inline illustration may preserve the story better than a cramped imitation of the desktop arrangement.
03 / MAKE SOMETHING
Your guided lab
Create one packet-to-plant transition alongside the second and third chapters.
Sketch the three visual phases and identify the stable reading area.
Drive only the chosen focal properties from tested progress.
Review slow scrolling, fast scrolling and the narrow layout.
What to produce
A staged narrative transition with readable text at every point.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The packet is recognizable before the transition and the planted row remains visible afterward. The transition uses a small number of coordinated properties, while headings and instructions remain in ordinary flow. Fast scrolling reaches a coherent final state rather than leaving half-hidden content. The narrow layout simplifies staging where necessary without deleting the explanation.
If something is not working
Everything moves at a different speed
Choose one focal transition and quiet supporting elements.
Text is readable only at a precise position
Remove essential text from transient visual states.
Take it one step further
Is a simpler mobile transition a reduction in storytelling quality?
Reveal the reasoning
Not necessarily. Preserving sequence, attention and readability matters more than reproducing desktop mechanics in insufficient space.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Why include a settled interval after a transition?
To make every transition take the same duration
To let the reader inspect the new state
To prevent the reader from reversing direction
Reference answer
B. A pause in visual change creates time to understand the result.
LESSON 4 / 3 min read / 30 MIN PRACTICE
Let the reader interrupt
The story belongs to the reader’s pace, device and motion preference.
Test alternate arrivals
Open a chapter link directly, resize halfway through a scene and switch to reduced motion. Ensure focusable controls are not hidden in off-screen decorative layers. Use normal anchors for the chapter index. A static mode should show complete information rather than leaving objects transparent because their entrance animation never ran.
Worked example
A deep link lands on Exchange before the opening animation executes. The chapter heading and copy must already be present. If the decorative packet needs a state, derive it from the current scroll position immediately; do not require the reader to revisit the top of the page to initialize the story.
Capstone practice
Finish the three-chapter seed-library page. Test keyboard navigation, direct links, quick reverse scrolling, resize and disabled JavaScript. Capture the static version and explain how the same narrative relationships remain visible.
Review criterion
The reader can choose the route and pace without losing information. Document any simplified mobile choreography as a deliberate composition, not an unfinished desktop effect.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Treat progress as reversible
Derive visual state from current progress instead of triggering one-way class changes that cannot recover. Scroll backward and jump between anchors. The scene should represent the reader’s current position, not the history of whichever events happened to fire.
02
Respect interruption
Do not intercept ordinary wheel or touch scrolling to force a timeline. Keep browser navigation and native anchors useful. If a user pauses midway, the text and illustration should remain coherent rather than waiting for an automatic sequence to finish.
03
Design the static mode
Reduced motion can show the key illustrations in their chapter positions without transforms. Disable nonessential continuous work and retain all content. A static narrative is a deliberately composed alternative, not a broken animation frozen at an arbitrary frame.
03 / MAKE SOMETHING
Your guided lab
Complete the seed-library story and run an interruption review.
Scroll forward/backward, jump to every anchor and reload with a chapter hash.
Test fast movement and stopping in the middle of the transition.
Compare full-motion and reduced-motion reading paths.
What to produce
A complete scroll story with native navigation and a composed static version.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Every navigation route reaches the correct chapter, and current progress determines the visual state in both directions. Reduced motion places useful still illustrations beside the relevant text. No essential content waits for an animation event. The review records any sticky-header offset and the tested narrow layout, so direct links do not land beneath obscuring navigation.
If something is not working
Reverse scrolling leaves stale visuals
Compute state from current progress rather than one-time triggers.
An anchor lands under the header
Account for the fixed header in the target’s scroll offset.
Take it one step further
Why should the static version be reviewed as its own composition?
Reveal the reasoning
Removing movement changes relationships and emphasis. A deliberate static layout preserves the narrative instead of exposing an accidental intermediate frame.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
A chapter is opened through a direct link. What should initialize the scene?
The current page position
Only a previous entrance event
A forced trip back to the top
Reference answer
A. The current state must be recoverable without replaying the entire journey.
Capstone project
Tell the story of a seed library in three chapters: collection, exchange and regrowth. Use one coherent visual object that changes meaning across chapters. Build a readable static document first, then add optional progress-driven motion and a keyboard-accessible chapter index.
Write and lay out the complete static story.
Map one visual transition to each chapter’s local progress.
Test interruption, reversal, resize and reduced motion.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Give each chapter one distinct narrative purposeEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep all essential text in normal document flowEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Clamp local progress and handle resizeEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Preserve meaning with reduced motion and no scriptEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Test reverse scrolling, direct chapter links and narrow screensEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Design a spring-driven control that responds to interruption, preserves continuity and settles predictably.
For: Interaction designers who code and frontend developers refining direct manipulation. Before you begin: JavaScript animation loops, velocity, basic algebra and DOM pointer events. Your outcome: An interruptible spring control with documented parameters, keyboard behavior and a reduced-motion alternative.
15 min reading · 120 min labs · 150 min project. Planning estimates.
Course map
Understand the response — Relate parameters to visible behavior.
Design for interruption — Keep continuity without compromising control semantics.
LESSON 1 / 3 min read / 30 MIN PRACTICE
Separate the target from the current position
A spring is a relationship between where an object is and where it is being asked to go.
Name the state
Track current position, velocity and target. Stiffness pulls toward the target; damping resists velocity; mass affects acceleration. Begin in one dimension so the response is easy to inspect. Draw position over time and describe overshoot, settling time and interruption without relying on a library’s preset names.
Worked example
A thumb currently sits at x=20 while its target is x=100. It accelerates toward the target, then damping reduces its energy. Increasing stiffness makes the pull stronger; increasing damping changes how the motion settles. Changing both at once makes it harder to understand the response you are designing.
Practice
Draw three desired responses: calm arrival, lively overshoot and a nearly immediate control. Choose which one fits a small settings switch and explain why. The switch’s semantic on/off state should update from the user’s action, not wait for the decorative thumb to finish moving.
Common mistake
Using visible animation completion as the only source of product state makes a slow or interrupted effect delay the actual interaction.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Separate meaning from movement
A toggle’s selected state changes immediately when activated. A decorative indicator may move toward the selected position afterward. The application should not wait for the indicator to arrive before considering the choice active.
02
Track the simulation
Store current position x, velocity v and target t. The spring responds to displacement x minus t, while damping responds to velocity. The target is an input; the current position is the simulated output. Confusing them causes jumps or delayed semantic state.
03
Use a visible diagnostic
Show target, position and velocity as text or a small graph while tuning. A spring can overshoot its target naturally, but the values should remain finite and eventually settle. Start in one dimension so the behavior is easy to inspect.
03 / MAKE SOMETHING
Your guided lab
Build a two-position selector with immediate selection and a spring-driven indicator.
Update the semantic selected value directly on activation.
Keep target, position and velocity separate.
Display diagnostics and compare the selected label with the moving indicator.
What to produce
A selector whose meaning is immediate and whose movement is independently inspectable.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Activating the second option updates its selected state and target immediately. The indicator moves from its existing position toward the new target while its velocity evolves. The selected content is usable during motion. This separation prevents animation timing from becoming business logic and makes reduced-motion behavior straightforward: set the indicator directly to the target.
If something is not working
The choice activates only after settling
Move semantic selection into the input handler.
Every activation jumps to a starting coordinate
Preserve current position and update only the target.
Take it one step further
Can the indicator overshoot while the selected option remains unambiguous?
Reveal the reasoning
Yes. Selection is a discrete application state, while the indicator is a visual response. Keep labels and accessibility state tied to selection, not instantaneous position.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
When should a settings switch’s semantic state change?
When the user activates it
Only after all bounce stops
When the thumb first crosses the midpoint
Reference answer
A. The spring visualizes the state change; it should not own the meaning of the control.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Integrate with a bounded step
A numerical spring is an approximation whose stability depends on how time is handled.
Step the model
The example uses semi-implicit Euler integration: update velocity from acceleration, then position from the new velocity. This is an educational integrator, not a universal physics solver. Feed it small bounded time steps, use positive mass, and choose parameters within the stable range you have tested. Subdivide long elapsed intervals rather than taking one huge step.
Worked example
A frame arriving after 200ms should not be passed directly to an aggressively stiff spring. Several small steps or a capped catch-up policy avoids a sudden numerical explosion. Capping time deliberately sacrifices perfect elapsed-time simulation to preserve a useful interface response. Document that tradeoff.
Practice
Run the step function with the same total duration using 1/60 and 1/120 second steps. Compare the resulting trajectories within a reasonable tolerance. Then inject one long delay and test your chosen subdivision policy.
Common mistake
A mathematically plausible force equation can still become unstable when integrated poorly. Test the numerical behavior, not only the appearance at your monitor’s normal refresh rate.
For a simple unit-mass model, acceleration is -stiffness × (x - target) - damping × velocity. Increasing stiffness changes restoring force; increasing damping removes motion energy. The values are parameters of this model, not direct duration and easing controls.
02
Use seconds consistently
Animation timestamps are in milliseconds, but the integration step should use a chosen consistent unit. Convert once. Update velocity from acceleration, then position from the new velocity for a semi-implicit Euler step. Large steps can destabilize even a sensible-looking parameter set.
03
Subdivide long intervals
Cap accumulated time and integrate in small steps. Reset the previous timestamp when resuming after a pause. Compare a normal frame sequence with a simulated delayed frame rather than assuming every device supplies identical intervals.
03 / MAKE SOMETHING
Your guided lab
Implement a one-dimensional spring step and a bounded frame accumulator.
Write the force and document the units of dt.
Compare several small steps with one deliberately oversized step.
Handle a long pause without injecting its entire elapsed time.
What to produce
A finite, bounded spring simulation with time-step tests.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The update uses seconds consistently and bounds the amount of simulated time consumed in one frame. Small substeps reduce sensitivity to frame variation. The experiment demonstrates why a giant dt can produce an implausible leap, then confirms the production loop avoids it. Parameters are tuned only after the integration policy is stable.
If something is not working
The spring moves hundreds of times too fast
Check millisecond-to-second conversion and parameter units.
A delayed frame causes an explosion
Bound accumulated time and integrate in smaller substeps.
Take it one step further
Does requestAnimationFrame guarantee a constant time step?
Reveal the reasoning
No. Frame intervals vary with refresh rate, workload and page lifecycle. Use timestamps and an explicit integration policy.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What is a sensible response to one very long frame interval?
Use an unbounded step
Subdivide or cap the simulation interval
Multiply velocity by frame count
Reference answer
B. Bounded steps avoid feeding an unstable jump into the integrator.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Retarget without restarting the object
Interruption is the ordinary case for a control that someone can operate quickly.
Preserve continuity
When a new target arrives, keep the current position and velocity. Replace the target and let the simulation respond. Resetting velocity to zero on every click creates an unnatural stop. For direct dragging, distinguish the pointer-controlled phase from the released spring phase and decide how release velocity enters the model.
Worked example
The panel is moving open when the user closes it. Its existing velocity may carry it slightly farther before the spring reverses direction. That continuity makes the object feel coherent. Snapping back to a predefined start point breaks the relationship between the pointer action and the visible object.
Practice
Toggle the target five times at irregular intervals. Log position immediately before and after each target change; it should remain continuous. Repeat with keyboard activation. Decide whether the movement is appropriate for the product, then tune the response rather than removing interruption support.
Common mistake
Queueing every requested animation makes the interface replay obsolete intentions. A control should move toward the latest target, not perform a history of earlier clicks.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Interrupt mid-flight
Activate the second option and immediately return to the first. The target changes, but the indicator already has a position and velocity. Preserve those values so the spring responds continuously to the new destination.
02
Compare restart and retarget
A restarted animation may jump to a fixed origin or abruptly zero velocity. A retargeted spring changes acceleration according to the new displacement while retaining continuity. Capture both behaviors in a controlled demo to understand the difference rather than merely calling one smoother.
03
Bound the product behavior
If the visual indicator must stay inside a track, choose how to handle overshoot: tune parameters, clamp only the presentation with care, or use a model appropriate to the constraint. Do not silently clamp state in a way that creates unexplained velocity spikes.
03 / MAKE SOMETHING
Your guided lab
Add rapid alternating input and compare preserved-velocity retargeting with a reset variant.
Trigger a new target at several points in the first movement.
Inspect position and velocity continuity at the event.
Choose a documented overshoot policy for the actual control.
What to produce
An interruption-safe spring interaction with a reasoned constraint policy.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The production version changes target only, retaining current x and v. Its trajectory bends toward the new destination without teleporting. Semantic selection still updates immediately. If overshoot would cross an unsafe visual boundary, tune the model or choose a clearer constrained treatment; record that decision. The reset variant remains only an explanatory comparison, not the delivered behavior.
If something is not working
Rapid clicks cause visible jumps
Inspect handlers for resetting x or v on every target change.
Clamping creates sticky edges
Review how position constraints interact with retained velocity.
Take it one step further
Why might the indicator briefly continue away from a newly chosen target?
Reveal the reasoning
It has existing velocity. The new spring force changes that velocity over time. This can be a coherent physical response if the control remains clear and bounded.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What should change when an in-flight spring is retargeted?
The target, while preserving current position and velocity
The position back to its original start
Every previous target in a queue
Reference answer
A. Preserving the physical state maintains continuity while responding to the newest intent.
LESSON 4 / 4 min read / 30 MIN PRACTICE
Define rest and respect preference
A finished motion system knows when to stop doing work.
Use two thresholds
Consider the spring at rest when both distance to target and velocity are small. Snap the final tiny remainder to the target and stop requesting frames. Distance alone can be misleading when the object passes the target at high speed. Reduced-motion mode can update the visual position immediately or use a much smaller nonessential transition.
Worked example
The thumb crosses the target while still moving rapidly. Stopping because the position is momentarily close produces an abrupt cutoff. Requiring low velocity as well allows a natural settle. When the user requests reduced motion, the control remains fully functional with the thumb placed directly at the selected end.
Capstone practice
Deliver the control, parameter notes and interruption tests. Verify the loop stops at rest, restarts after a new action, and is removed on teardown. Test rapid keyboard activation and a delayed frame as well as ordinary pointer clicks.
Review criterion
Explain why the chosen response fits this control. A spring is successful when it clarifies the interaction and survives interruption, not when it bounces as much as possible.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Define rest with two conditions
A small position error alone is insufficient if velocity remains high. Require both distance-to-target and speed to fall below documented thresholds, then snap exactly to target and zero velocity. This prevents endless tiny updates and guarantees a precise final state.
02
Own the loop
Schedule animation only while movement is needed. New input wakes the simulation; rest or disposal stops it. Store the callback identifier and remove listeners on teardown. Repeated mounting should not create multiple independent loops.
03
Respect motion preference
When reduced motion is active, update semantic state and position directly, zero velocity and stop scheduling. Handle preference changes while the component is open. The control should remain fully functional rather than waiting for an animation it no longer runs.
03 / MAKE SOMETHING
Your guided lab
Finish the spring selector with rest detection, lifecycle cleanup and reduced motion.
Choose distance and speed thresholds appropriate to the control’s scale.
Count scheduled frames after settling and after disposal.
Change motion preference during movement and verify the final selection and position.
What to produce
A complete spring control with deterministic final state and bounded work.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The loop stops only after both thresholds are satisfied, then sets x exactly to target. A new target restarts from that state. Reduced motion immediately resolves the visual position while retaining the same selected value and keyboard behavior. Disposal cancels pending work and removes preference listeners. The result is a complete interaction, not an endlessly running physics demonstration.
If something is not working
The loop runs forever at tiny amplitudes
Use both rest thresholds and snap to the exact target.
Reduced motion leaves the indicator halfway
Set position to target, zero velocity and stop the loop.
Take it one step further
Why check velocity as well as distance before declaring rest?
Reveal the reasoning
A spring can pass close to its target at high speed. Distance alone would stop it at an arbitrary crossing rather than a settled state.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which pair gives a useful rest condition?
Small distance and small velocity
Small distance only
A fixed elapsed time regardless of velocity
Reference answer
A. An object can pass near the target at high speed, so both conditions matter.
Capstone project
Build a two-position switch or sliding panel whose visual motion follows a spring. Use native semantic controls, support rapid retargeting, and document position, velocity, stiffness and damping. Include a reduced-motion mode and a delayed-frame test.
Model and graph a one-dimensional spring.
Connect target changes to a semantic control.
Test interruption, delayed frames, rest and reduced motion.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Separate semantic state from animated positionEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Preserve velocity when the target changesEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use bounded time steps and explicit rest thresholdsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Support keyboard activation and visible focusEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Offer immediate or minimal movement when reduced motion is requestedEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Create a reproducible poster family by balancing a small set of visual rules with seeded variation.
For: Designers who know basic JavaScript and developers interested in visual systems. Before you begin: JavaScript loops, arrays and basic Canvas 2D drawing. Your outcome: A seeded Canvas poster generator with bounded parameters, three curated outputs and an export workflow.
13 min reading · 120 min labs · 150 min project. Planning estimates.
Course map
Write the grammar — Create a system with recognizable constants.
Curate the possibility space — Make variation repeatable, bounded and usable.
LESSON 1 / 3 min read / 30 MIN PRACTICE
Decide what never changes
A generative identity needs constants that make different outputs feel related.
Write the grammar
List the fixed rules before choosing randomness: margin, grid, palette, title zone and one family of shapes. Then name the variables, such as position within a cell, rotation or density. Keep the information hierarchy independent of chance so every output remains usable as a poster.
Worked example
The listening festival uses a warm paper ground, black circular arcs and a narrow lime accent. Every poster reserves the lower quarter for the event name and date. The artwork changes above that zone, but the margins and typography hold the family together.
Practice
Draw one poster without randomness. Write five rules another person could follow to create a related version. Identify which rule protects the title from being obscured. If the identity only exists in one lucky composition, refine the grammar before automating it.
Common mistake
Randomizing every property creates unrelated images rather than a visual system. Start with a small possibility space that you can understand and art-direct.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Write the poster contract
For a fictional listening festival, fix a three-color palette, a title region, a date line and an underlying grid. Decide which relationships must survive every generated result. The system’s identity comes from these constraints, not from the random generator alone.
02
Choose the variable fields
Allow bounded changes to circle size, line direction or density outside the title region. Start with two variables. If every property changes freely, evaluating the generator becomes an endless search for accidental success.
03
Create a nonrandom reference
Compose one strong poster manually using the rules. It demonstrates what the system is trying to preserve. Generation should explore a designed space around that reference rather than compensate for an undefined visual direction.
03 / MAKE SOMETHING
Your guided lab
Design the fixed rules and one manual reference for the listening-festival poster.
Specify palette, grid, title clearance and information hierarchy.
Choose two variable properties and their allowed ranges.
Create a reference composition and explain how every rule appears in it.
What to produce
A generator contract and a complete nonrandom poster.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The title remains legible, the date has a stable place and the palette creates a recognizable identity. Variation affects supporting geometry rather than essential content placement. The manual reference is useful because it proves the rules can produce an intentional composition before automation multiplies them. If the reference is weak, revise the rules first.
If something is not working
Generated results have no shared identity
Strengthen invariants before adding more variation.
The title is frequently obscured
Reserve an explicit protected region in the composition rules.
Take it one step further
Why create a manual reference before coding the generator?
Reveal the reasoning
It establishes a visual target and tests whether the rules can produce a good composition. Randomness should explore an intentional system, not substitute for one.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which part should usually remain independent of random variation?
Essential information hierarchy
Every decorative shape position
Every optional accent angle
Reference answer
A. The event information must remain legible across the entire output family.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Make chance reproducible
A seed turns an interesting accident into a design you can revisit.
Use a deterministic sequence
The small generator below produces the same sequence from the same unsigned 32-bit seed. It is suitable for visual variation, not security or scientific simulation. Create it once for a render and consume values in a consistent order. Reinitialize it when regenerating a poster from a saved seed.
Worked example
Seed 42 gives a useful arrangement of arcs. Saving only a screenshot loses the ability to revise it at another size. Saving the seed, parameter values and generator version lets you reconstruct the composition. Changing the order of random calls can still change the result, so version the rule set when it evolves.
Practice
Generate five numbers twice from the same seed and compare them. Then draw a grid using those values for bounded rotations. Reload the page and verify that the same seed reproduces the same output.
Common mistake
Reading fresh Math.random values during export produces a different poster from the preview. Render both from the same saved design state.
function seededRandom(seed) {
let value = seed >>> 0;
return () => {
value = (Math.imul(1664525, value) + 1013904223) >>> 0;
return value / 4294967296;
};
}
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Control the random source
Math.random does not provide a user-selected repeatable seed. For this creative exercise, use a small deterministic generator whose state advances on each call. It is suitable for visual variation, not security, lotteries or other cryptographic purposes.
02
Keep call order stable
The same seed produces the same sequence only if the algorithm and order of random calls remain the same. Adding a random color choice before positioning changes later values. Separate streams or precomputed parameter records can reduce unintended coupling.
03
Record the whole recipe
Seed alone is insufficient if canvas dimensions, palette or algorithm version change. Store seed, dimensions, parameter values and a generator version with each selected output. That record makes review and export reproducible.
03 / MAKE SOMETHING
Your guided lab
Generate and recreate a poster using an explicit seed and recipe.
Replace random calls with a deterministic generator.
Render the same recipe twice and compare the result.
Change one parameter, then restore it and reproduce the original.
What to produce
A reproducible generator with a visible seed field and recipe record.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The same recipe recreates the same geometry because seed, dimensions, settings and call order are stable. A new seed changes the allowed variation while preserving the invariant layout. The recipe includes an algorithm version so later code changes do not falsely promise identical output. This is a reproducibility contract, not a claim of cryptographic randomness.
If something is not working
The same seed gives different posters
Inspect dimensions, random call order and unrecorded settings.
Changing color unexpectedly changes geometry
Separate random streams or generate a stable parameter record first.
Take it one step further
Is saving only the seed enough to reproduce an image after rewriting the generator?
Reveal the reasoning
No. The algorithm and its call order are part of the recipe. Preserve a version or the generated parameter record as well as the seed.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What should be saved with the seed for reliable reproduction?
Parameters and the rule-set version
Only the exported pixel dimensions
Only a screenshot of the favorite output
Reference answer
A. A seed is meaningful in the context of the generator and the sequence of decisions it drives.
LESSON 3 / 3 min read / 30 MIN PRACTICE
Bound the variation, then curate it
A useful generator produces a range you can explain, not a stream you hope will occasionally work.
Choose distributions deliberately
Uniform random placement can create clusters by accident. A grid with bounded jitter preserves rhythm while allowing local differences. Limit the allowed angles or palette combinations if those constraints strengthen the identity. A density control should have a meaningful minimum and maximum, not simply expose an arbitrary loop count.
Worked example
Each grid cell contains one arc, shifted by at most a tenth of the cell width. This keeps a recognizable scaffold. Three curated seeds demonstrate quiet, balanced and dense compositions without changing the title zone. The designer can explain why each belongs to the same festival.
Practice
Render a contact sheet of twelve seeds at the lowest and highest density. Identify recurring failures, such as collisions with the title or large accidental voids. Change the rule that causes the failure instead of deleting only the unlucky seed.
Common mistake
Manual curation is useful, but it should not hide a generator whose ordinary outputs violate the design requirements. Test the range as well as the favorite example.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Reject invalid arrangements
Before drawing, check whether a proposed shape intersects the protected title area or exceeds the canvas. Limit retries so impossible constraints cannot create an endless loop. If no valid candidate is found, use a documented fallback arrangement.
02
Review a contact sheet
Generate twelve recipes and compare them together. Look for title clarity, focal balance, rhythm and meaningful variation. A single lucky output cannot establish that the system works across its intended range.
03
Revise a rule, not a favorite
If many posters crowd the lower corner, adjust the distribution or density bound. Keep the same review seeds when comparing the revision so the effect of the rule change is visible. Curate final outputs while recording why rejected candidates fail.
03 / MAKE SOMETHING
Your guided lab
Create a twelve-poster contact sheet and improve one recurring weakness.
Implement title-zone exclusion with a bounded placement attempt count.
Score each recipe against four visual criteria.
Revise one rule and regenerate the same seeds for comparison.
What to produce
A before/after contact sheet and a documented curation decision.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The revised system improves the recurring issue across the fixed seed set rather than polishing one selected poster manually. Placement terminates predictably, with a valid fallback if constraints are too tight. The final selection names its visual strengths and preserves the recipe. Rejected results remain useful evidence of how the rule set was refined.
If something is not working
Generation occasionally hangs
Bound rejection attempts and define a fallback.
Only one seed looks good
Review the distribution and constraints across a fixed contact sheet.
Take it one step further
Should every generated result be accepted merely because it follows the numeric rules?
Reveal the reasoning
No. Numeric validity and visual quality are different gates. Use visual criteria to refine the rules and curate the final output.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Several seeds collide with the title. What is the durable fix?
Exclude the title zone in the placement rule
Keep generating until one looks good
Remove the title
Reference answer
A. A structural constraint protects every output instead of only a curated example.
LESSON 4 / 3 min read / 30 MIN PRACTICE
Export the design you actually previewed
The export is part of the product, with its own dimensions and quality checks.
Separate design space and output size
Define the composition in a logical coordinate space, then scale the drawing context for the export dimensions. Render from the same seed and parameters used by the preview. Wait for any fonts or images before drawing. Use canvas.toBlob for a PNG and release temporary object URLs after download.
Worked example
The preview is 600 by 800 CSS pixels, while the export is 1800 by 2400 pixels. Scaling the same logical composition preserves margins and relationships. Increasing only the canvas dimensions without scaling the drawing coordinates leaves the artwork stranded in one corner.
Capstone practice
Deliver the generator and three curated seeds with their settings. Export each, inspect its pixel dimensions and compare the content with the preview. Include a text summary of the generated design for users who cannot inspect the canvas.
Review criterion
Someone else can reproduce a chosen poster, change one parameter and export the expected composition. Record any limits, such as raster output or fonts required by the local project.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Separate recipe from drawing
Generate the composition parameters once, then pass them to a draw function. Preview and export should consume the same recipe. Calling the random generator again during export can produce a different poster even if the preview looked correct.
02
Scale deliberately
Choose export dimensions and scale all geometry and typography consistently from the design coordinate system. A larger canvas with unchanged coordinates merely shrinks the composition into one corner. Wait for required fonts before drawing text.
03
Verify the artifact
Export a PNG, open it and compare it to the selected preview. Record dimensions and the recipe alongside it. Cross-origin imagery can taint a canvas; use appropriately permitted assets or original geometry and document the source policy.
03 / MAKE SOMETHING
Your guided lab
Finish the generator with preview, seed controls and verified PNG export.
Make preview and export share one immutable recipe.
Export at a documented higher resolution and inspect text and geometry.
Save the seed/settings/version record beside the image.
What to produce
A working poster generator, selected PNG and reproducible recipe.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The exported poster matches the preview’s arrangement, palette and typography, with dimensions confirmed after opening the file. A single draw function maps the same recipe into the chosen output size. Export waits for fonts and does not reroll randomness. The accompanying record allows the composition to be recreated in the same generator version rather than leaving only an unexplained image.
If something is not working
Export differs from preview
Reuse the generated parameters instead of drawing new random values.
Typography changes in the PNG
Wait for font readiness and inspect the exported artifact itself.
Take it one step further
Does a successful download event prove the exported poster is correct?
Reveal the reasoning
No. Open the artifact and verify dimensions, text, composition and correspondence with the selected preview. File creation and content correctness are separate checks.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
What keeps the exported composition consistent with the preview?
The same saved design state and a scaled logical coordinate system
Fresh random values at export time
Only increasing CSS width
Reference answer
A. Reusing design state preserves the artwork while the output scale changes.
Capstone project
Design a poster family for an imaginary listening festival. Fix a grid, palette and type zone, then vary the artwork with a seed. Provide seed and density controls, a reproducible reset and a PNG export at a documented size.
Define the visual grammar and draw one static poster.
Add seeded variation and labeled controls.
Curate three outputs and validate the export dimensions.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Separate fixed identity rules from variable parametersEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Reproduce an output from its seed and settingsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep variation inside meaningful boundsEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Preserve the title and information hierarchyEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Export the intended dimensions without clipping or unreadable textEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?
Build a small, deliberate sound instrument with an amplitude envelope, visual feedback and explicit control over playback.
For: Creative developers exploring sound as part of an interface. Before you begin: JavaScript events and animation loops; basic understanding of frequency and amplitude. Your outcome: A three-note browser instrument with smooth gain envelopes, clear controls and reliable stop behavior.
14 min reading · 120 min labs · 150 min project. Planning estimates.
Course map
Build the sound path — Connect source, envelope and output deliberately.
Design the interaction — Make sound controllable, visible and optional.
LESSON 1 / 3 min read / 30 MIN PRACTICE
Start with consent and a signal path
A sound interface should explain what will happen before it makes noise.
Draw the graph
An oscillator creates a signal, a gain node controls its amplitude, and the destination sends it to the output. Create or resume the AudioContext from a user action and handle a failed resume visibly. Begin at a conservative gain. Offer a persistent stop or mute control rather than relying on closing the page.
Worked example
A button says “Enable sound” before the three note buttons become available. The page explains that the instrument is optional. When the context is ready, the status changes to Sound ready. A text label and visual pulse communicate activation for someone who cannot or does not want to listen.
Practice
Sketch the signal graph and the interface states: disabled, enabling, ready and stopped. Implement the enable button first, then one short note. Test keyboard activation and a browser where audio starts suspended.
Common mistake
Creating sound during page load surprises the listener and may be blocked by the browser. Treat audio availability as an explicit state, not an assumption.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Ask through the interface
Use a labeled Start audio button and a visible volume control. Do not autoplay sound. Browser audio contexts may begin suspended and require a user gesture to resume. Handle that state and show truthful feedback if audio cannot start.
02
Draw the graph
For a three-note instrument, each oscillator feeds a note gain, note gains feed a master gain and the master connects to destination. Start with a conservative level. The graph explains where envelopes belong and where one control can reduce the entire output.
03
Keep silent use complete
Provide visual note feedback and keyboard-operable controls. Sound can enrich the experience, but instructions and control state remain visible. Avoid making a user infer whether audio is enabled only by listening.
03 / MAKE SOMETHING
Your guided lab
Create a three-note instrument with explicit enablement and master volume.
Draw the oscillator-to-envelope-to-master signal path.
Create or resume the context from the Start audio gesture.
Test the visual controls with volume at zero and when audio start fails.
What to produce
An opt-in instrument with a documented graph and silent interaction path.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Audio begins only after explicit activation. The interface distinguishes enabled, suspended and unavailable states honestly. A master gain offers one reliable output control, and each note has its own envelope. Visual feedback confirms the selected note even in silence. The initial level is conservative, and the person can stop sound without navigating away.
If something is not working
The button changes but no audio starts
Inspect context state and await resume before claiming success.
Silent mode hides all feedback
Keep note and control states visible independently of audio.
Take it one step further
Why should the Start button wait for the audio context’s result before announcing readiness?
Reveal the reasoning
The request can fail or remain suspended. The displayed state should describe the actual audio system rather than the intention to start it.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
When should the page first try to enable audio?
After explicit user activation
Immediately on page load
Whenever the pointer moves
Reference answer
A. The user should choose when sound becomes available.
LESSON 2 / 4 min read / 30 MIN PRACTICE
Shape the beginning and the end
An amplitude envelope makes a note feel intentional and avoids abrupt signal jumps.
Schedule against the audio clock
Use context.currentTime for audio automation. Ramp gain from zero to a conservative peak, then back to zero before stopping the oscillator. The example assumes an already resumed AudioContext and creates a new oscillator for each note. A stopped oscillator cannot be restarted; reuse the context and create new source nodes.
Worked example
A 220Hz sine note rises over 30ms, then fades out over the remaining fraction of a second. The gain node is the envelope, while frequency controls pitch. The example disconnects the oscillator and gain when the note ends. Keep a master gain above individual notes if several can overlap.
Practice
Compare a short and a slightly longer attack at low volume. Describe the perceived difference without increasing loudness. Add a master mute that remains effective while a note is already playing.
Common mistake
Using setTimeout for precise envelope steps ties audio timing to a busy main thread. Schedule the ramps on the audio timeline.
function playNote(context, output = context.destination, frequency = 220) {
const oscillator = context.createOscillator();
const gain = context.createGain();
const now = context.currentTime;
oscillator.frequency.value = frequency;
gain.gain.setValueAtTime(0, now);
gain.gain.linearRampToValueAtTime(0.08, now + 0.03);
gain.gain.linearRampToValueAtTime(0, now + 0.45);
oscillator.connect(gain).connect(output);
oscillator.onended = () => { oscillator.disconnect(); gain.disconnect(); };
oscillator.start(now);
oscillator.stop(now + 0.46);
return oscillator;
}
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Shape the onset
An oscillator connected at nonzero gain can begin with an abrupt discontinuity. Start its gain at zero and ramp to a modest peak over a short attack. The chosen timing affects character, but it should also avoid unintended clicks.
02
Shape the release
Ramp down before stopping the oscillator. Exponential ramps require a positive target, so use a small positive floor and then set zero when appropriate, or use a suitable linear ramp. Schedule against the audio context’s clock rather than ordinary timer timing alone.
03
Own each voice
Create a fresh oscillator for each note, schedule its stop and disconnect it after ending. Track active voices so Stop can reach them. Repeated taps should not accumulate unbounded oscillators or unexpectedly multiply loudness.
03 / MAKE SOMETHING
Your guided lab
Implement a short note with an attack, decay/release and scheduled cleanup.
Schedule gain from zero to a conservative peak and back down.
Stop after the release and disconnect ended nodes.
Compare abrupt and enveloped versions at a safe level, then inspect an offline waveform if available.
What to produce
A bounded note function with envelope and cleanup behavior.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
The note begins at zero gain, rises smoothly and returns to silence before its oscillator stops. Timing uses currentTime and scheduled AudioParam changes. Ended nodes are removed from the active set and disconnected. The comparison should reveal why an envelope matters, but listening alone is not proof of a zero tail; an offline render can provide a measurable check of the final samples.
If something is not working
Release scheduling throws an error
Check whether an exponential ramp was given a zero or negative value.
Repeated taps get progressively louder
Inspect active-voice limits, cleanup and master gain.
Take it one step further
Why schedule oscillator.stop after the gain release rather than at its beginning?
Reveal the reasoning
Stopping immediately would cut the waveform before the envelope reaches silence, defeating the intended release and potentially creating an abrupt discontinuity.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Which clock should schedule a gain envelope?
AudioContext.currentTime
The timestamp from a DOM click event
A CSS transition duration alone
Reference answer
A. Audio automation uses the audio context’s own time base.
LESSON 3 / 4 min read / 30 MIN PRACTICE
Visualize a useful property
The display should reveal something about the sound instead of pretending to measure more than it does.
Choose the signal
An analyser can provide time-domain samples or frequency data. For a simple level display, choose a clearly described amplitude measure and smooth the displayed value modestly. The display is not a calibrated sound-pressure meter. Keep the reading meaningful when muted and avoid relying on color alone to indicate sound state.
Worked example
A horizontal bar follows a smoothed level estimate while a text label identifies the active note. The bar decays after the note ends. A reduced-motion setting can replace continuous movement with a static active/inactive indicator while preserving the note label and controls.
Practice
Draw a level display and label what it represents. Test silence, a short note and overlapping notes. Compare the signal before and after the master gain, then choose the location that matches the promise made by the UI.
Common mistake
Sampling before the master mute can make a display look active while the output is silent. That may be useful for an input meter, but misleading for an output-level indicator.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Choose the property
A waveform shows sample amplitude over time; a frequency display shows energy across frequency bins. A note indicator merely shows which control was activated. Decide which information is useful before adding animated bars.
02
Read the analyser deliberately
Connect an AnalyserNode at the point whose signal you want to inspect and choose an appropriate FFT size. Reuse typed arrays instead of allocating them on every frame. Explain whether the display reflects one voice or the mixed master signal.
03
Bound the visual work
Draw only while the view and audio visualization need updates. Reduced motion can show a stable note/status display instead. The visualizer should not keep an animation loop alive forever after all voices have ended and the view is hidden.
03 / MAKE SOMETHING
Your guided lab
Add a waveform or frequency view and label what it represents.
Choose the analyser’s position in the signal path and justify it.
Reuse the sampling buffer and render a bounded canvas view.
Compare one note, overlapping notes, silence and reduced motion.
What to produce
An accurately labeled audio visualization with a low-motion alternative.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
A master waveform display receives the mixed signal and clearly says so. Its buffer is reused, dimensions are bounded and the loop stops when no longer useful. Silence produces a stable baseline rather than fabricated activity. The low-motion mode retains note names and audio status. The display is presented as an illustration of the signal, not calibrated loudness measurement unless such calibration was actually implemented.
If something is not working
Bars move during silence
Check whether the display is driven by actual analyser data or a decorative loop.
Every frame allocates a new buffer
Reuse the typed array and resize only when analyser settings change.
Take it one step further
Can an uncalibrated analyser graphic justify a claim that sound is safe at every device volume?
Reveal the reasoning
No. It visualizes the digital signal, not the listener’s acoustic exposure. Keep output conservative and provide clear volume and stop controls without making unsupported safety claims.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
An output-level display should usually sample where?
After the master gain
Before mute regardless of its label
From the note frequency alone
Reference answer
A. The location should correspond to the output signal the label promises to show.
LESSON 4 / 3 min read / 30 MIN PRACTICE
Make stopping as reliable as starting
A sound instrument is unfinished until every active resource has a clear ending.
Track ownership
Keep a set of active source nodes and remove each when it ends. A stop action should silence the master gain immediately and stop active sources safely. Stop visual animation when it is no longer needed. On teardown, remove listeners and close an AudioContext owned by this instrument; do not close one shared by unrelated features.
Worked example
Rapidly pressing three note buttons creates overlapping sources. Stopping only the last oscillator leaves earlier notes sounding. Tracking all active sources makes the stop button truthful. The ready state can remain available for another deliberate activation, while full page teardown releases the owned context.
Capstone practice
Finish the three-note instrument with master volume, mute and stop. Test rapid repeated activation, keyboard use, suspended context, reduced motion and removal during playback. Include a silent visual mode and a short statement of what the level display measures.
Review criterion
A user can understand, start and stop the experience without surprises. Sound adds a dimension to the interaction, but does not become the only channel for essential information.
02 / WORK THROUGH THE EXAMPLE
Follow the decisions
01
Define Stop precisely
Stop should prevent new note scheduling, release active voices and leave visible feedback. A mute control changes output level; stopping additionally ends the owned sources. Decide whether Start can resume afterward and represent that state clearly.
02
Handle lifecycle changes
When the view is disposed, stop voices, cancel visualization frames and disconnect owned nodes. Close a context only if this component owns it exclusively. A shared application audio context must not be closed by one child view.
03
Test repeated use
Start, play rapidly, stop, restart and leave the view. Check active voice counts and the silent tail in an offline render where possible. Reset timing on return and avoid automatically resuming unexpected sound after a hidden interval.
03 / MAKE SOMETHING
Your guided lab
Finish the three-note instrument and verify its stop/restart lifecycle.
Track voices and remove them when ended.
Exercise Stop during overlapping notes and verify no new scheduled notes continue.
Dispose/remount and compare active nodes, visual loops and silent-mode controls.
What to produce
A complete opt-in instrument with reliable Stop, silent feedback and teardown evidence.
Allow about 30 minutes. The lab develops the practice introduced above; it is one assignment, not extra duplicate work.
04 / REVIEW YOUR WORK
Compare the reasoning
Make an attempt first, then compare your decisions. A different result can be valid when you can show how it meets the goal.
Read the reference response
Stop releases and ends every owned voice, cancels pending scheduling and updates the visible state. Restart follows an explicit gesture and creates fresh sources. Disposal removes visualization callbacks and releases only resources owned by this component. The report includes rapid-input and stop-during-release cases. An offline silent-tail check supports the envelope claim, while an actual browser interaction check supports the enablement and controls claim.
If something is not working
Stop silences output but voices keep accumulating
End and disconnect owned sources as well as reducing gain.
Closing one view breaks another instrument
Review ownership before closing a shared AudioContext.
Take it one step further
Why are mute and stop different lifecycle operations?
Reveal the reasoning
Mute changes audible output while work may continue. Stop ends the relevant sources and scheduling. A reliable instrument defines both behavior and resource consequences explicitly.
Explain your answer before opening the response. This is a self-check, not a graded assessment.
Knowledge check
Why track all active oscillators?
To stop every overlapping note reliably
To reuse stopped oscillators for later notes
To make the visualization set the pitch automatically
Reference answer
A. Stopping only the newest source can leave earlier notes playing.
Capstone project
Create a three-note instrument for an imaginary sound gallery. Start audio only after explicit activation, provide a visible master volume and stop control, and draw a simple level visualization. Keep all controls usable by keyboard and all meaning available without sound.
Build one explicitly activated note with a quiet envelope.
Add three notes, keyboard-operable controls and a level display.
Test repeated activation, mute, stop and removal from the page.
Review the finished project
For each acceptance criterion, record the artifact or observed behavior that supports it. Mark it Ready only when you can show that evidence. Otherwise, name the revision and repeat the relevant lesson lab.
Your review rubric
Create or resume audio only after a user gestureEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Keep gain conservative and offer a clear mute/stop controlEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Shape note onset and release with gain automationEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Use native controls with visible state and keyboard accessEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Stop oscillators and animation loops and close owned audio resources on teardownEvidence: a specific example from your project. Decision: Ready / Revise, with a reason.
Finish with a short reflection: Which decision improved your result? Which case still needs work? What would you test next? Completion records your own progress; no instructor grading or certification is implied.
Course feedback
Which example clarified a decision? Where did you need more guidance? Which exercise will you apply to your own work?