Component questions vs app questions
Frontend design prompts come in two shapes, a reusable component or a whole product, and each needs a different emphasis and a different use of your 45 minutes.
Two prompts, one wrong answer
Picture two candidates on the same afternoon. The first gets "Design an autocomplete for a search box." The second gets "Design a news feed like the one on a social network." Both have studied the same notes, and both open with the same plan: a box for the browser, a box for the API server, a box for the database, a CDN in front.
The first candidate spends twelve minutes drawing servers for a widget that has one endpoint. The interviewer keeps asking "what does the parent page pass in?" and "what happens when I press the down arrow?" The candidate never reaches keyboard support, never names the combobox role, and never handles the race between two slow responses. The feedback says: "Strong backend instincts, didn't design the component."
The second candidate does the opposite mistake. They write a careful PostCard props type, discuss whether onLike should be a callback or an event, and debate slots for the footer. Thirty minutes in, they haven't said how the feed loads its second page, where posts are cached, or how a new post shows up. The feedback says: "Good React knowledge, no system design."
Why the shape of the prompt matters
Frontend system design prompts come in two main shapes. A component question asks for one reusable piece of UI that other engineers drop into their pages. An app question asks for a whole product with screens, a server, and data that changes while people use it. Each shape has a different main user, a different hard part, and a different place where your minutes should go.
The interviewer usually knows which shape they asked for, and their rubric reflects it. A rubric for a date picker has lines like "keyboard navigation", "controlled vs uncontrolled", and "locale and time zones". A rubric for a chat app has lines like "message ordering", "real-time transport", and "offline send queue". You score on the lines that exist.
Time spent on topics that aren't on the rubric is time you can't spend on the ones that are.
This lesson teaches you to spot the shape in the first minute, what to emphasize in each, how the RADIO time split moves with scope, and how to handle the prompts that sit in between. It builds on the RADIO framework lesson (Requirements, Architecture, Data model, Interface, Optimizations) and on What interviewers look for, by level. Read those first if the five steps are new to you.
The mental model: who is your user, and where is the hard part?
Think of a door handle and a house. An architect asked to design a door handle thinks about hands: the grip, how far it turns, whether a child or someone with arthritis can use it, and whether it fits doors made by other companies. An architect asked to design a house thinks about rooms, pipes, wiring, and how people move between spaces. The handle is one line in a long list.
Both are design, and both architects are skilled. But the questions they ask, the drawings they make, and where their hours go are completely different. Frontend prompts work the same way.
The two archetypes
A component question asks for one piece of UI with a public API: an autocomplete, an image carousel, a date picker, a data table, a modal dialog, a toast system. You are writing a small library, and the server is one endpoint or none at all.
Your first user is another developer, who passes in props and listens for events. Your second user is the person who clicks, types, or listens with a screen reader.
An app question asks for a product: a news feed, a chat app, an online store, a photo sharing site, an email client. You are the tech lead. Your user is the customer, on a slow phone, scrolling for twenty minutes. The hard parts are about data: where it comes from, how it's cached, how it stays fresh, and how the first page loads fast.
Between them sit feature questions: a comment section, a notification bell, a checkout flow, a file uploader with progress. They are a small app inside a bigger one. They need some API design and data flow, plus a component-style contract with the page that hosts them.
Two tests that sort almost any prompt
You don't need a long checklist. Two questions sort almost every prompt you'll get.
- Who is the main user of my design? If it's a developer who will import it, you're designing a component. If it's a customer using a product, you're designing an app.
- Where does the hard part live? If it lives inside one rectangle on the screen (keyboard, focus, rendering, timing), it's a component. If it lives between the browser and the server (loading, caching, syncing, scale), it's an app.
When both answers point the same way, you're done. When they disagree, you have a feature question or an ambiguous prompt, and you should ask (chapter 3 covers how).
| Question | Component question | App question |
|---|---|---|
| Main user | A developer who imports it, then the person who uses it | The customer using the product |
| Where the hard part lives | Inside the rectangle: input, focus, rendering, timing | Between client and server: loading, caching, freshness |
| What the interface means | Props, events, slots, keyboard map | Endpoints, payloads, pagination, real-time messages |
| How many boxes in the architecture | 3 to 5, all inside the browser | 8 to 12, across browser, edge, and servers |
| What success looks like | Another team uses it without reading the source | Fast first page, fresh data, survives bad networks |
| Typical deep dives | Accessibility, request races, virtualization, positioning | Pagination, normalized cache, real-time, rendering strategy |
Check your understanding · Exercise 1
Which of these prompts are component questions? Select all that apply.
Spotting the shape in the first minute
Most prompts tell you their shape in the words they use. You only need to listen for it, then confirm with one question. This takes under a minute and decides how you spend the next forty.
Signal words in the prompt
- Component signals: "component", "widget", "for our design system", "reusable", "that other teams can use", "embeddable", or a noun that is clearly one piece of UI ("a date picker", "a modal", "a carousel").
- App signals: a product name ("Design Twitter", "Design YouTube"), "app", "platform", "site", "for millions of users", or a verb about people doing things ("users can post, follow, and comment").
- Feature signals: "a section of", "a page in", "add X to our product" ("add comments to our blog", "a checkout flow for our store").
Watch for prompts that name a product but ask for a part of it. "Design YouTube" is an app. "Design YouTube's video player" is a component, with a hard part (adaptive streaming, buffering states, captions, keyboard shortcuts) that lives inside one rectangle.
Questions that confirm the shape
Even when the words are clear, confirm in one sentence. It costs ten seconds and shows the interviewer you know the two shapes need different answers. Good confirming questions sound like this:
- "Is this a shared component for a design system, used by many teams, or a field in one form?" (for a date picker)
- "Should I treat this as a reusable editor component with a clean API, or as a product where documents are saved and shared?" (for a rich text editor)
- "Do you want the whole product, or should I focus on the feed page and treat profiles and messaging as out of scope?" (for Design Instagram)
Notice that each question offers a default. Interviewers often say "your call", and a candidate who picks a sensible scope and explains why scores better than one who waits for permission.
Prompts that could be either
Some prompts are open on purpose, to see whether you notice. The common ones, and a sensible default for each:
| Prompt | As a component | As an app | Sensible default |
|---|---|---|---|
| Rich text editor | Editor with toolbar, selection model, paste handling, plugins | Docs product with saving, sharing, and live editing | Component, with one short section on saving |
| Image gallery | Grid and lightbox with keyboard, lazy loading, zoom | Photo site with uploads, albums, and sharing | Ask: the two answers barely overlap |
| Data table | Sorting, filtering, virtualized rows, sticky headers | An admin dashboard with server-side queries and exports | Component; mention server-side sorting at scale |
| Video player | Controls, buffering, captions, adaptive bitrate | A video platform with uploads, feeds, comments | Component, unless the prompt names a product |
| Poll widget for news sites | Embed snippet, isolation, tiny bundle, accessibility | Poll service with vote limits and live results | Component with a small API: get poll, vote, results |
Think first
The prompt is "Design a poll widget that news sites can embed in their articles." Component or app, and where would most of your time go?
Mostly a component question with a twist: it runs on other people's pages. The interface is the embed snippet and its options (poll id, theme, size), not React props. The deep dives are isolation (an iframe or shadow DOM so the host page's CSS can't break it), a tiny bundle that doesn't hurt the host's load time, and accessibility.
The server stays small but not empty: three calls (get the poll, cast a vote, get results), plus one sentence on how you limit votes to one per person and how results refresh. For live results, a slow poll (every 10 to 30 seconds, only while the widget is on screen) is usually enough; across millions of article views, a poll every few seconds would be a heavy load.
Check your understanding · Exercise 2
You're given "Design a rich text editor." Which first moves are good? Select all that apply.
Component questions: think like a library author
In a component question, the interface is the product. The server is small, so the design lives in three places: the API another developer types, the behavior the end user feels, and how the component fits into pages you've never seen.
Props and events: the contract
Start the Interface step by writing the props as a type. Each prop is a decision you can defend in one sentence. What goes in (items, value, label), what comes out (onChange, onSelect, onOpenChange), and which defaults make the common case one line of code.
type AutocompleteProps<T> = {
// Parent owns the network call; the component owns timing and keyboard.
search: (query: string, signal: AbortSignal) => Promise<T[]>;
getLabel: (item: T) => string;
renderOption?: (item: T, state: { active: boolean }) => ReactNode;
value?: T | null; // controlled when given
defaultValue?: T | null; // uncontrolled otherwise
onChange?: (item: T | null) => void;
minChars?: number; // default 2
debounceMs?: number; // default 200
label: string; // required: the accessible name
};
AbortSignal lets the component cancel stale requests, and making label required means no team can ship it without an accessible name.Controlled or uncontrolled is the first question every interviewer asks about state. Controlled means the parent owns the value and passes it in with value and onChange, like a React input with value. Uncontrolled means the component keeps its own value and the parent only reads it when needed, with defaultValue. Good shared components support both: controlled for forms that validate on every change, uncontrolled for the quick case.
A common mistake is to emit vague events. onChange(value) for a modal that can close five ways is not enough. Say why it closed: onOpenChange(false, { reason: "escape" }) lets a form warn about unsaved changes only when the user pressed Escape, not when they clicked Save.
Customization without forks
Every team that adopts your component will want it to look slightly different. If the only way to change the option row is to copy your code, you'll have twelve forks within a year. Pick how teams customize it, and say why.
Decision How should other teams customize the look of the component?
What we pick: For a design-system component, combine the first two: a few configuration props for the common cases and slots for the parts teams most often change. Offer a headless hook as a second layer only if many teams need fully custom markup. Good examples to name: Downshift and React Aria ship headless hooks, and Radix ships unstyled parts that teams style themselves.
States and accessibility
List every state the component can be in and give each a design: idle, loading, results, empty, error, disabled, and the awkward ones like very long text or 10,000 items. Interviewers notice when a candidate draws only the happy path.
Accessibility is almost always one of your deep dives. Name the pattern from the WAI-ARIA Authoring Practices Guide (APG): combobox with a listbox for an autocomplete, dialog for a modal, tablist for tabs. Then name the keyboard map (arrows, Enter, Escape, Home, End, Tab), where focus goes, and what a screen reader announces, for example through aria-activedescendant and a polite live region for the result count. The ARIA widget patterns lesson covers each pattern in depth.
Fitting any page
- Performance inside the box: debounce typing, virtualize long lists, lazy-load hidden slides, avoid layout shift when the popup opens.
- Theming: CSS custom properties or design tokens, so teams change colors without overriding your selectors.
- Layout edges: popups that flip near the viewport edge, right-to-left languages, phone keyboards that cover half the screen.
- Rendering: works with server rendering (no
windowaccess during render) and doesn't break hydration. - Bundle size: a shared component ships on many pages, so 20 KB of extra JavaScript is paid by every one of them.
Check your understanding · Exercise 3
You're designing a modal dialog for a design system. Which choices make its API better? Select all that apply.
App questions: think like a tech lead
In an app question, the hard parts live between the client and the server. Props still exist, but nobody will grade the props of your PostCard. The challenge is breadth: more parts, more data, more ways to fail. You won't cover everything, so the skill is picking what matters and showing how it fits together.
The client-server contract
In an app question, the Interface step is mostly the network API. Name the two or three calls the main screen needs, with their payload shape, how they page, and how errors come back. You don't need every field; you need the fields that drive decisions.
GET /api/feed?cursor=eyJpZCI6OTg3fQ&limit=20
200 OK
{
"items": [
{ "id": "p_981", "authorId": "u_12", "text": "...",
"media": [{ "url": "...", "width": 1080, "height": 1350 }],
"likeCount": 42, "likedByMe": false, "createdAt": "2026-10-19T09:12:00Z" }
],
"users": { "u_12": { "name": "Asha", "avatarUrl": "..." } },
"nextCursor": "eyJpZCI6OTYxfQ"
}
Say why you picked REST, GraphQL, or a backend-for-frontend (a thin server shaped for one client). For a feed, a single REST endpoint with a cursor is a fine default. GraphQL earns its place when many screens need different slices of the same data. The interviewer cares that you chose on purpose, not which one you chose.
Data flow and the client store
Next, say where server data lives on the client and how it moves. The usual answer is a query cache (TanStack Query, SWR, or RTK Query) keyed by request.
For data that appears on many screens, add normalization: each post and user stored once by id, and lists holding only ids. Then a like on a post in the feed also updates the same post on the profile page, because there is only one copy. Apollo Client and Relay normalize automatically for GraphQL; with TanStack Query or SWR you add a small merge step or a separate entity store.
Separate the kinds of state out loud: server state (posts, users), UI state (which menu is open), URL state (the current tab, a search query, a selected post), and form state (a half-written comment). Each lives in a different place, and saying so shows you know why.
Freshness, loading, and failure
- Freshness: how new content arrives. Polling (typically every 30 to 60 seconds), server-sent events, or WebSockets, and why. Most feeds show a "New posts" pill instead of pushing content under the reader's thumb.
- The user's own actions: optimistic updates for likes and comments, with rollback when the server says no.
- First load: server rendering or streaming for the first page, code splitting by route, images sized and lazy-loaded, and how Core Web Vitals look on a mid-range phone.
- Long sessions: virtualizing a list that grows to 2,000 posts, and dropping media that scrolled far away.
- Failure: retries with backoff, an offline banner, a send queue for chat, and what the page shows when one service is down.
Check your understanding · Exercise 4
It's minute 18 of "Design a chat app". Which topics deserve your next 15 minutes? Select all that apply.
How scope changes the RADIO time split
RADIO works for both shapes. The five letters stay; the minutes move. The RADIO framework lesson gives a default split for a 45-minute round: about 3 minutes of hellos, then 5 for Requirements, 8 for Architecture, 4 for Data model, 5 for Interface, and 15 for Optimizations, with 5 left for your questions. That default fits a feature question, which sits in the middle.
For the two archetypes, shift minutes from the parts that shrink to the parts that grow. The total design time stays at about 37 minutes.
| Step | Component (min) | Feature, the default (min) | App (min) |
|---|---|---|---|
| Requirements | 5 | 5 | 5 |
| Architecture | 4 | 8 | 9 |
| Data model | 4 | 4 | 5 |
| Interface | 7 | 5 | 4 |
| Optimizations (deep dives) | 17 | 15 | 14 |
| Total design time | 37 | 37 | 37 |
Why each step grows or shrinks
- Requirements stay about the same. Both shapes need the same short list: functional, non-functional, out of scope. The content differs (props and devices versus users and scale), not the length.
- Architecture halves for a component. Three or four boxes inside the browser (input, popup list, controller, cache) take four minutes. An app needs the client layers, the API, a CDN, a real-time channel, and arrows between them.
- Data model grows a little for an app. A component has internal state:
query,activeIndex,isOpen,status. An app has entities and relations, a normalized store, and URL state. - Interface flips. For a component it's the main event: props, events, slots, and the keyboard map. For an app it's two or three endpoints with their paging and errors; component props get a sentence.
- Deep dives keep the largest share in both. That's where levels are separated. A component's deep dives are inside the box (accessibility, races, virtualization). An app's are between client and server (pagination, caching, freshness, first load).
Checkpoints: requirements done by minute 8, the box diagram by minute 12, interface done and deep dives started by minute 23, wrap up by minute 40.
- Requirements: props, states, devices, the accessibility bar, bundle budget
- Architecture: 3 or 4 boxes in the browser: input, popup, controller, cache
- Data model: internal state: query, activeIndex, isOpen, status
- Interface: the main event: props, events, slots, keyboard map
- Deep dives: accessibility, request races, long lists, positioning
Same letter, different drawing
The bigger change isn't the minutes. It's what you put on the whiteboard for each letter. A candidate who keeps the app-style drawing for a component, even with the right minutes, still spends Architecture drawing servers nobody asked about.
Check your understanding · Exercise 5
You're 20 minutes into "Design a date picker for our design system" and you've just finished a server diagram with a holidays API and a CDN. What's true? Select all that apply.
Worked example: an autocomplete, minute by minute
Here is how a strong 45-minute answer to "Design an autocomplete for our design system" spends its time. The full design is in the Design an autocomplete guide; this chapter shows only the shape of the answer and why each minute goes where it does.
Minutes 3 to 8: requirements
Confirm the shape first: "This is a shared component that many teams will drop into search boxes and forms, right?" Then ask about the data (local list or a server search, how many results, how fast the endpoint is), the inputs (keyboard, touch, screen readers), the browsers, and the bundle budget. Write down a short list:
- Functional: show matches as you type, select with mouse, touch, or keyboard; works with a local list or a server search; custom option rows.
- Non-functional: suggestions within 400 ms after typing stops on 4G; full keyboard and screen reader support (APG combobox); under 10 KB gzipped; works with server rendering.
- Out of scope: the search backend and its ranking, multi-select chips (offer them as an extension).
Minutes 8 to 16: architecture and state
The architecture is four boxes, all in the browser: the input, the popup with its list, a controller that owns timing and the keyboard, and a small cache. One arrow leaves the browser, to the search function the parent passes in. That takes four minutes, and that's correct: there's nothing more to draw.
The state is just as small: query, items, activeIndex, isOpen, status (idle, loading, success, empty, error), and a cache of recent queries mapped to results. Say that the selected value can be controlled by the parent, which leads straight into the interface.
Minutes 16 to 23: the interface
This is the longest early step, and it should be. Write the props type from chapter 4, then the events, then the keyboard map: Down and Up move the active option, Enter selects, Escape closes the popup (and clears the box on a second press), Home and End move the cursor in the text, Tab leaves without selecting. Say how customization works (renderOption, a slot for the empty state).
Design an autocomplete: the board, step by stepStep 1 of 5: Requirements, minutes 3 to 8
Requirements, minutes 3 to 8: Confirm it's a shared component, then write the needs, the accessibility bar, and what's out of scope. About 5 minutes.
Minutes 23 to 40: deep dives
Pick three, say why, and go deep. Each one is about something that happens inside the box:
- Stale responses. The user types
rea, thenreac; therearesponse arrives last and overwrites the better list. Fix: abort the old request withAbortControllerand ignore any response whose query doesn't match the current one. - Fewer requests. Debounce typing by about 200 ms, wait for 2 characters, and cache recent queries so backspacing is instant. Typing
javascriptdrops from 10 requests to 1 or 2. - Accessibility. Focus stays in the input; the active option is pointed to with
aria-activedescendant;aria-expandedandaria-controlslink input and list; a polite live region says "5 results". Test it with VoiceOver and NVDA, not only with a linter.
If time is left, mention long lists (cap at 10 or virtualize), popup positioning near the screen edge and above a phone keyboard, and input methods for Chinese or Japanese, where you must not search during composition. The Design a modal dialog guide follows the same shape: a tiny architecture, a large API section (open state, close reasons, initial focus), and deep dives on focus trapping, returning focus, and scroll locking.
Think first
Halfway through the autocomplete, the interviewer asks "so how does the search server work?" How deep do you go?
One level. Describe the endpoint's contract in a sentence or two: GET /search?q=rea&limit=10 returns ranked items, with short cache headers so repeated queries are cheap. Mention that the component aborts stale requests, so the browser drops them and a server that watches for closed requests can stop work on them.
Then come back: "The ranking itself is a backend topic. On the client, what matters is that we never show stale results and never send more requests than we need. Shall I go on with that?" This answers the question without trading away the component's deep dives.
Worked example: a news feed, minute by minute
Now the same clock for "Design a news feed". The full design is in the Design a news feed guide. Compare where the minutes go with the autocomplete: Architecture more than doubles, the Interface shrinks to the network API, and the deep dives move from inside the box to between client and server.
Minutes 3 to 8: requirements
Cut scope early, because an app has more features than you can design: "I'll focus on reading the feed, liking, and commenting. Posting with media gets a short section. Profiles, messaging, and ads are out of scope." Then ask about scale and devices, and use a quick estimate (the Back-of-the-envelope numbers for frontend lesson shows how).
- Functional: infinite scroll of posts with text and images; like and comment; see that new posts exist without losing your place.
- Non-functional: first posts visible in under 2.5 seconds on a mid-range phone on 4G (LCP); smooth scrolling through 1,000+ posts; works on flaky networks; images don't shift the layout.
- Out of scope: ranking (the server decides the order), ads, messaging.
Minutes 8 to 17: architecture
Draw the whole system in one picture: the browser with its view layer, a client store (query cache with normalized posts and users), a data layer that talks to the feed API, a CDN for images and static files, and a channel for new-post notices. Mark which page is server rendered. This takes about nine minutes, and every box will come back in a deep dive.
Minutes 17 to 26: data model and API
Name the entities: Post, User, Comment, and the feed as a list of post ids with a nextCursor. Say they're normalized, so a like updates the post everywhere it appears. Then give the API from chapter 5: GET /feed?cursor=...&limit=20, POST /posts/:id/like, GET /posts/:id/comments?cursor=.... Two sentences on why a cursor beats an offset: new posts at the top would shift offset pages and cause duplicates.
Note what isn't here: no PostCard props type, no keyboard map. If the interviewer wants a component, they'll ask, and you can zoom in later.
cursor instead of an offset, ids in the view and posts in the store, a pill instead of pushing posts under the reader.Minutes 26 to 40: deep dives
- Loading and pagination. An
IntersectionObserversentinel near the bottom starts the next page before the reader gets there; the cursor guarantees no duplicates; one page in flight at a time. - Long sessions. Virtualize the list so only the 10 to 20 posts near the viewport are in the DOM; reserve image space from the API's
widthandheightso nothing jumps. - Freshness. Poll a cheap "anything new?" endpoint (typically every 30 to 60 seconds) or listen on server-sent events; show a "New posts" pill instead of inserting posts above the reader.
- Instant likes. Optimistic update in the normalized store, rolled back with a toast if the request fails.
That's four deep dives in fourteen minutes, so each gets three or four minutes. That is normal for an app: breadth is part of the signal, and you go deepest on the one or two the interviewer leans into.
Design a news feed: the board, step by stepStep 1 of 5: Requirements, minutes 3 to 8
Requirements, minutes 3 to 8: Cut scope hard: reading, liking, commenting. Name the load target and the scale. About 5 minutes.
Check your understanding · Exercise 6
In the news feed answer, which of these belong in the deep dives rather than the earlier steps? Select all that apply.
Feature questions, zooming, and the mistakes that cost points
Real prompts don't always sit at either end. Feature questions mix both shapes, and good answers move between levels on purpose. This chapter covers the middle ground, how to switch levels cleanly, and the mistakes interviewers see most often.
Feature questions: two interfaces
A feature like a comment section has two interfaces. Facing the server, it needs an API: list comments with a cursor, post a comment, maybe a stream of new ones. Facing the host page, it's a component: postId, currentUser, an onCountChange event so the page header can update its comment count. Sketch both, briefly, and spend the deep dives on what makes this feature hard: threaded replies, optimistic posting, moderation states.
| Prompt | Shape | Where the depth is |
|---|---|---|
| Autocomplete | Component | Request races, debouncing, caching, combobox keyboard support |
| Modal dialog | Component | Focus in and out, inert background, scroll locking, stacking |
| Image carousel | Component | Lazy loading, swipe and keyboard, reduced motion, layout shift |
| Data table | Component | Virtualized rows, sorting and filtering API, sticky headers |
| Comment section | Feature | Threads, paging replies, optimistic posting, moderation |
| Notification bell | Feature | Real-time delivery, unread count across tabs, batching |
| File uploader | Feature | Chunked uploads, resume after failure, progress, cancel |
| News feed | App | Cursor pagination, virtualization, normalized store, new posts |
| Chat app | App | WebSockets, ordering, offline send queue, delivery receipts |
| Collaborative editor | App | Conflict resolution, presence, offline edits |
Zooming in and out on purpose
Strong candidates change level during the round, and say when they do. In an app question, zoom into one component for a deep dive once the data flow is clear: the feed's virtualized list, the chat composer's send button states. In a component question, zoom out briefly to show where its data comes from, then come back.
The rule is to finish the level you're on before you leave it, and to announce the switch: "The data flow is in place. I'd like to zoom into the feed list for a few minutes, because that's where scrolling performance is won or lost." Without the announcement, the interviewer loses the thread, and a zoom looks like drifting.
Mistakes that cost points
- Servers for a widget. Drawing a load balancer, database, and cache cluster for a date picker. The interviewer can't score any of it.
- Props for a product. A careful
PostCardtype at minute 20 of a news feed while pagination and caching are still blank. - Happy path only. A component with no loading, empty, or error state, or an app where nothing ever fails.
- Accessibility as a footnote. "And we'd add ARIA" at minute 44. In a component question, it's a main deep dive; in an app, at least name focus handling for route changes and dialogs.
- Never confirming the shape. Spending ten minutes on the wrong kind of answer for an ambiguous prompt, when one question would have fixed it.
What changes with seniority
Junior candidates are expected to cover the basics of the shape they're given: a sensible props type, or a sensible API and box diagram. Mid-level candidates should pick the right emphasis without being told and handle the main states and failures. Senior and staff candidates spot the shape and scope it in the first minute, offer a default for ambiguous prompts, explain trade-offs before being asked, and zoom between levels cleanly. The What interviewers look for, by level lesson covers these signals in detail.
Check your understanding · Exercise 7
You're designing a comment section that teams can add to any article page. What should your Interface step include? Select all that apply.
Summary
- Frontend prompts come in two main shapes: a component (one reusable piece of UI for other developers) and an app (a product with screens, a server, and changing data). Feature questions sit in between.
- Two tests sort most prompts: who is the main user of the design, and does the hard part live inside one rectangle or between client and server?
- Confirm the shape in the first minute with one question that offers a default. For ambiguous prompts like a rich text editor, pick a scope and say why.
- In component questions, the interface is the product: props and events, controlled and uncontrolled, customization, every state, and the APG accessibility pattern.
- In app questions, the hard parts are the client-server contract and data flow: endpoints and pagination, a normalized client store, freshness, first load, and failure.
- The RADIO minutes move with scope: about 5, 4, 4, 7, 17 for a component and 5, 9, 5, 4, 14 for an app in a 45-minute round. Deep dives keep the largest share in both.
- Zoom between levels on purpose and say so out loud: into one component in an app question, out to the data source in a component question.
In the interview
Questions interviewers ask about this. Answer each out loud first, then compare.
Question 1
You're asked to "Design a date picker." What do you ask first, and where does your time go?
First the shape: is it a design-system component shared by many teams, or one form's field? That decides how much the API and customization matter. Then single dates or ranges, which locales and time zones, minimum and maximum dates, and keyboard and screen reader support (it should have both).
Architecture takes a few minutes: an input, a popup with a month grid, and a controller. The Interface gets the most early time: value and onChange, defaultValue, min and max, locale, an isDateDisabled function. Deep dives: the APG date picker dialog keyboard map (arrows by day and week, Page Up and Page Down by month), week start and month names by locale, and storing dates without time-zone bugs.
Question 2
How would your answer to "Design an image carousel" change if the prompt were "Design Instagram"?
For the carousel, the product is the component: props for slides and the current index, keyboard and swipe, lazy loading slides you can't see, no layout shift, and respecting prefers-reduced-motion.
For Instagram, the carousel is one box. The time goes to the feed API and cursor pagination, a normalized store of posts and users, image delivery through a CDN with responsive sizes, uploads, and how likes and new posts arrive. If there's time, I'd zoom into the carousel as one deep dive, after the data flow is clear.
Question 3
In a component question, the interviewer asks how the data gets there. How deep do you go?
One level. Say whether data comes in through props (items) or through a function the component calls (search), and what the component does around that call: debounce, cancel stale requests, cache recent results. Describe the endpoint's shape in a sentence.
Then return to the component and say why: the search backend isn't where this question's score is, and the client-side handling of that call is.
Question 4
How should the RADIO time split differ between a component question and an app question in a 45-minute round?
Requirements stay at about 5 minutes in both. For a component, Architecture shrinks to about 4 because it's a few boxes in the browser, and the Interface grows to about 7 because props, events, and the keyboard map are the product. That leaves about 17 minutes of deep dives.
For an app, Architecture grows to about 9 and the Data model to 5, because there are more parts and entities, while the Interface is mostly two or three endpoints in about 4 minutes. Deep dives get about 14. In both, the deep dives keep the largest share, because that's where levels are separated.
Question 5
The prompt is "Design a comment section for our blog platform." Is it a component or an app question?
Neither exactly: it's a feature. It has a server side (list comments by cursor, post, edit, delete, maybe live updates) and a host-page side (a component with postId, currentUser, and events like onCountChange).
I'd use the default split, sketch both interfaces briefly, and spend deep dives on threaded replies and paging them, optimistic posting with rollback, and moderation states such as pending and removed.
References
- WAI-ARIA Authoring Practices Guide: Patterns The keyboard and ARIA contract for combobox, dialog, tabs, grid, and more: the core of most component answers.
- WAI-ARIA APG: Combobox pattern Roles, states, and keys for an autocomplete.
- React docs: Sharing state between components (controlled and uncontrolled) Defines controlled and uncontrolled components, the first API question in most component rounds.
- MDN: Intersection Observer API The usual way to trigger the next page in an infinite feed.
- web.dev: Largest Contentful Paint (LCP) The load metric to name in an app question's non-functional requirements.
- TanStack Query documentation A common client cache for server state, useful to name in an app's data flow.
Read next
- The RADIO frameworkA five-part checklist, Requirements, Architecture, Data model, Interface, and Optimizations, for running a frontend system design interview: design the right thing, cover the basics fast, and save time for deep dives.
- What interviewers look for, by levelThe six areas interviewers typically score in a frontend system design round, how the bar rises from junior to staff, and how to make the signals of your target level visible, minute by minute.
- Back-of-the-envelope numbers for frontendQuick, rough math with round numbers (bytes over the network, CPU time on a cheap phone, memory in a long-lived tab, and requests per second at the server) that turns "this might be slow" into a reason to pick one design over another.
- ARIA widget patternsThe tested recipes for custom widgets from the ARIA Authoring Practices Guide: combobox, listbox, menu, tabs, dialog, tree, grid, disclosure, and accordion, with the roles, states, and keys each one promises, and how to pick the right one.
- Pagination: offset, cursor, and keysetWays to load a long list one piece at a time, and why the choice decides whether users see duplicates, miss items, or wait on slow deep pages when the list changes.