HomeJournalThis post

Frontend architecture designers should understand

Designers who understand components, state, data shape, routes, performance, and accessibility make stronger product decisions.

JP
JP Casabianca
Designer/Engineer · Bogotá

Designers do not need to become backend engineers to work well with product teams.

But designers who understand frontend architecture make better product decisions. They understand why some changes are cheap and others are risky. They design states instead of screens. They notice when a component wants to become a system primitive. They can talk about data shape, rendering, validation, accessibility, and release behavior without turning the conversation into implementation theater.

This is especially true for designer-engineer roles. The value is not only that I can draw and code. The value is that I can move between product intent and implementation constraints without losing either side.

DesignIntent and behavior

What the user should understand, decide, recover from, and trust.

FrontendState and contracts

How data, components, routes, forms, and interactions make behavior real.

ProductOutcome and operation

What ships, how it is measured, and how the team maintains it.

Figure 1: Frontend architecture is where design intent becomes durable product behavior.

Components are not just boxes

A component is a product decision with an API.

Designers often think of components visually: button, card, input, table, modal. Engineers think of them behaviorally: props, slots, state, events, composition, validation, accessibility, and data. Good product work needs both views.

If a designer understands the component API, they are less likely to create variants that look plausible but do not belong. They can ask whether a new card state is a one-off product need or a reusable primitive. They can understand why a destructive modal needs a different confirmation path than an informational modal. They can see when a table cell is not just text but a formatted value with permissions, loading, empty, and error states.

The visual shape matters, but the behavioral contract is what makes the component safe to reuse.

State is the real design surface

Screens are snapshots. Products are state machines.

The user experiences transitions:

  • loading to ready
  • empty to populated
  • valid to invalid
  • saving to saved
  • failed to recovered
  • allowed to denied
  • fresh to stale
  • selected to confirmed
Data state UI state User action stale, empty, failed copy + controls retry, edit, confirm Design quality improves when the team names states before styling screens.
Figure 2: State is the practical bridge between frontend architecture and design.

When designers understand state, handoff improves. A Figma frame stops being the only artifact. The spec can say what happens while saving, what happens if the integration is partially connected, what happens when old records have missing fields, and what the user can do after failure.

This is where many polished designs fail. They show the ideal condition and leave production to invent everything else.

Data shape affects interface shape

The data model leaks into the UI whether the team wants it to or not.

If a value can be null, the design needs an unknown state. If a list can be huge, the design needs filtering, pagination, virtualization, or a different information architecture. If permissions differ by role, the design needs disabled, hidden, or explanation states. If data arrives from multiple systems, the design needs freshness and partial failure language.

Designers do not need to write the database schema, but they should ask data-shape questions:

  • Can this be missing?
  • Can this be delayed?
  • Can this be wrong?
  • Can two users see different values?
  • Can old records lack this field?
  • Can the action fail after the UI says success?
  • Can the object be deleted while the user is editing it?

Those questions change design decisions.

Routes are product structure

Routing is not only a technical concern.

Routes define shareability, back behavior, loading boundaries, browser history, analytics, and how users recover orientation. A modal route behaves differently than a local modal. A filter encoded in the URL behaves differently than a filter stored in memory. A wizard with real routes behaves differently than a wizard hidden inside one component.

Designers who understand routing make better workflow decisions.

For example:

  • Should this drawer be shareable?
  • Should the detail page survive refresh?
  • Should filters persist in the URL?
  • Should the user be able to open this in a new tab?
  • Does back return to the list state or leave the workflow?
  • Does the route boundary need its own loading state?

These are UX questions with frontend consequences.

Performance is user experience

Performance is not a final engineering optimization. It is part of the product feel.

A designer should understand the difference between:

  • initial page load
  • route transition
  • image loading
  • input responsiveness
  • table filtering
  • chart rendering
  • async action feedback
  • layout shift
LoadCan they start?

Initial rendering, critical content, images, data dependencies, and skeletons.

InteractDoes it respond?

Typing, filtering, opening drawers, saving, selecting, and cancelling.

TrustDoes it feel stable?

Layout shift, stale data, double submits, and late state changes.

Figure 3: Performance has product meaning: start, respond, and feel stable.

If a design depends on large images, heavy charts, or dense tables, performance should be part of the conversation early. Otherwise the implementation will either feel slow or cut the design under pressure.

Accessibility is architecture too

Accessibility is often discussed as visual contrast and labels. Those matter, but frontend architecture carries deeper accessibility decisions:

  • semantic elements
  • focus management
  • keyboard order
  • modal traps
  • live regions
  • error association
  • reduced motion
  • table structure
  • route announcements
  • disabled control behavior

Designers who understand those constraints design better interactions. They know that a fake button creates risk. They know that a drawer needs focus behavior. They know that error text must connect to the input. They know that keyboard users need a predictable path through the workflow.

Accessibility is not decoration added after the component exists. It is part of the component contract.

Validation belongs in the product model

Form validation is a good example of design and frontend architecture meeting.

A mockup may show red text under a field. Production needs more:

  • when validation runs
  • whether validation is local or server-side
  • how errors map to fields
  • whether input is preserved
  • where focus moves
  • how success is announced
  • what happens on partial failure
  • whether duplicate submit is prevented

Designers who understand validation can specify behavior instead of only styling. Engineers can then build the right model instead of guessing.

Design systems need contribution paths

Frontend architecture also shapes design-system adoption.

If the product needs a new density, state, or variant, where does it go? Does the team create a local workaround? Does it add a prop? Does it compose existing primitives? Does it open a contribution issue? Does it document the product example?

LocalOne surface

Useful for a contained product need that may not repeat.

CandidateRepeated pattern

Document with screenshots, constraints, and product examples.

SystemShared primitive

Name, implement, test, and support the durable version.

Figure 4: Frontend architecture gives design systems a path from local need to shared primitive.

Without that path, designers keep drawing exceptions and engineers keep shipping local CSS. The system stops learning.

Data shape changes the design

Designers do not need to model the whole database, but they should understand that data shape changes the interface.

A simple example is status. In Figma, a status might look like one chip: Active. In production, the data may have pending, active, paused, failed, archived, blocked, syncing, partially synced, and unknown. Some statuses can be changed by the user. Some belong to an external provider. Some are temporary. Some should not be shown to every role.

If the design treats status as a color label, the product will break down as soon as real records appear. If the design treats status as a state model, it can explain what the user can do next.

The same is true for numbers. Revenue might be gross, net, authorized, captured, refunded, estimated, or delayed. A chart might need to show missing data, not zero. A table might need to distinguish "none" from "not loaded." A settings value might be inherited from the workspace, overridden by the team, or locked by plan.

When designers understand data shape, they ask better questions before the mockup becomes a ticket.

Routes and URLs are product decisions

Frontend architecture also includes routing. Designers sometimes treat routes as implementation detail, but routes change user behavior.

A route decides whether a screen can be bookmarked, shared, refreshed, indexed, restored, or opened in a new tab. It affects support because a support agent may need to link a customer to a specific state. It affects analytics because the product needs to understand where users land and where they drop. It affects permissions because a deep link may expose a path the user cannot access.

For example, a command palette can open an action, but the final state might still need a route. A drawer can show details, but if the detail matters for collaboration, it may need a URL. A dashboard tab can be local state, but if the user returns every Monday to the same filtered view, the filter may belong in the URL.

The question is not "should everything be a page?" The question is "what product state deserves permanence?"

Designers who ask that question avoid fragile experiences. They also make support and QA easier because product states become addressable.

Loading is architecture, not decoration

Loading states reveal architecture.

If the entire page blocks until every request completes, the loading design is one thing. If the shell can render while panels load independently, the design is different. If cached data can appear while fresh data loads, the design needs a stale state. If a user action starts a background job, the UI needs progress, polling, notification, or return path.

A skeleton is not a strategy. It is one possible presentation of a data-fetching decision.

The better questions are:

  • What can appear immediately?
  • What depends on the slowest request?
  • Can old data be shown while refreshing?
  • Does the user need progress or just patience?
  • Can the action continue in the background?
  • What fails independently?
  • What state should be preserved if the user navigates away?

When designers understand this, their mocks stop showing a single generic loading screen. They start showing the actual product behavior: partial panels, disabled actions with reasons, pending states, retry affordances, and stale-data labels.

That is the difference between a pretty loading state and a usable async system.

Error states need ownership

Error states are another place where architecture matters.

An error is not just a red box. It is a decision about ownership. Did the user make a fixable mistake? Did the product fail to load data? Did an external provider reject the request? Did permissions change? Did the server accept the action but fail during a side effect? Did the system enter a pending state that support needs to inspect?

Each of those deserves different UI.

A user-fixable validation error should point to the field and preserve input. A permission error should explain access without pretending retry will help. A provider error may need a specific reason code, a support path, or a retry later. A partial failure may need to say what succeeded and what did not.

Designers who understand this write better specs:

  • "If payment fails after authorization, keep the order context and show provider reason when available."
  • "If sync is delayed, show last successful sync time and let the user continue."
  • "If the user lacks permission, hide edit controls where possible and explain access on deep links."
  • "If saving fails, keep the draft locally and let the user retry."

That level of specificity saves engineering time because the implementation does not have to invent the product promise.

Performance changes the perceived design

A design that looks calm in Figma can feel broken when it loads slowly.

Frontend architecture affects perceived quality through bundle size, image loading, route splitting, caching, hydration, animation cost, and layout stability. Designers do not need to optimize webpack, but they should understand that heavy visuals, large carousels, client-only dashboards, and custom fonts all have product cost.

The question I want designers to ask is not "is performance good?" It is "which part of this experience must feel immediate?"

In a checkout, the cart total and primary action need to feel immediate. In an analytics dashboard, the shell and last-known summary may matter more than waiting for every chart. In a portfolio page, the first image should be purposeful and fast because it sets credibility. In an admin table, filters and row actions need to respond without making users fear duplicate work.

Design can support performance by choosing:

  • fewer critical assets
  • stable aspect ratios
  • progressive content
  • server-rendered text where possible
  • deferred heavy panels
  • restrained animation
  • clear pending states
  • image crops that work at realistic sizes

Performance is not only an engineering metric. It is part of the user's trust in the product.

Accessibility is architecture too

Accessibility decisions often require component and state decisions.

A designer who understands frontend architecture will not ask for an inaccessible interaction and then expect engineering to "make it accessible" later. They will ask what semantic pattern fits the behavior.

For example:

  • Is this a button, link, checkbox, radio, select, combobox, menu, disclosure, dialog, or tab?
  • Does opening this surface trap focus?
  • Where does focus return?
  • Can the user operate this with keyboard only?
  • Is the visible label also the accessible name?
  • Does validation announce near the field?
  • Does the order of headings match the visual structure?
  • Does motion respect reduced-motion settings?

These questions influence layout, copy, and component choice. They cannot be solved entirely in CSS at the end.

For design systems, this is even more important. A shared component with weak accessibility spreads that weakness everywhere. A shared component with strong semantics lets product teams move faster without re-solving basics.

Handoff should include the things Figma cannot hold

Figma is good at visual structure. It is not enough for production behavior.

A useful handoff includes:

  • state inventory
  • data dependencies
  • permission rules
  • event names
  • validation rules
  • empty and error copy
  • responsive behavior
  • route behavior
  • focus behavior
  • analytics questions
  • release risks
  • follow-up cleanup

This does not have to be a giant spec. It can be a concise product note beside the design. The important thing is that the note carries the parts of the product that are invisible in a static frame.

The best handoff feels like a bridge. Engineering can see what is intended. Design can see what needs a decision. Product can see what will be measured. QA can see what to test.

What designers do not need to know

There is a limit. Designers do not need to know every framework API, every caching strategy, every compiler detail, or every deployment nuance. Trying to learn all of that before contributing would slow the team down.

The useful target is product-relevant architecture:

  • what has state
  • what persists
  • what can fail
  • what is shared
  • what is local
  • what is expensive
  • what is accessible
  • what is measurable
  • what is reversible
  • what needs ownership

That knowledge is enough to make better decisions and better artifacts. It also creates better collaboration because the designer can ask precise questions without pretending to be the engineer for every part of the system.

The portfolio angle

For my own work, this is something I want to show more directly. A case study should not only include final screens. It should include the architecture-adjacent artifacts that made those screens buildable:

  • route maps
  • state models
  • component decisions
  • data contracts
  • table behavior
  • error recovery
  • release checklists
  • browser QA notes

Those artifacts communicate a rare skill: I can care about taste and still respect production reality. I can make the interface feel good without pretending implementation constraints are someone else's problem.

That is especially relevant for engineering roles. A company hiring a product engineer wants someone who can make decisions across the boundary, not just implement tickets.

How this changes the day-to-day work

The point of understanding frontend architecture is not to sound technical in meetings. It is to make better day-to-day decisions.

It changes how I review a mockup. I am not only looking at alignment, hierarchy, and copy. I am asking whether the screen has enough states to be built, whether the route should preserve filters, whether the action needs optimistic feedback, whether the table can handle real content, and whether the component belongs in the system.

It changes how I write tickets. Instead of "build settings page," the ticket can name the data source, permissions, validation, analytics, empty state, failure state, and release risk. That makes the work easier to estimate and easier to review.

It changes how I talk to engineers. I can ask about the contract instead of asking for vibes. "Does this status come from the provider or our database?" is a better question than "Can we make this more reliable?" "Should this filter live in the URL?" is a better question than "Can users share this view?" "What fails independently?" is a better question than "Do we need loading states?"

It also changes how I cut scope. If a screen is too risky for the sprint, I can cut the expensive behavior while preserving the core product promise. Maybe the first version does not save custom views, but it still keeps filters in the URL. Maybe the first version does not have realtime updates, but it shows last refreshed time. Maybe the first version does not support every chart, but it makes the decision summary clear.

That is the practical value. Architecture knowledge turns scope negotiation into product judgment.

A lightweight architecture review checklist

Before a design becomes a build ticket, I like a short architecture review. It can be quick, but it should touch the risky parts:

  • What data powers each section?
  • Which states are missing from the mockup?
  • Which actions mutate data?
  • Which errors are user-fixable?
  • Which route state should be shareable?
  • Which components already exist?
  • Which pattern is new?
  • What happens on mobile with real content?
  • What keyboard path matters?
  • What event tells us the feature worked?
  • What part is likely to be hard to test?
  • What can be cut without breaking the promise?

This checklist is useful because it catches the expensive gaps early. It does not make the designer responsible for every implementation detail. It makes the conversation concrete enough for engineering to respond.

For candidate proof, this checklist can become a visual asset. Showing a filled version beside a case study tells the reader that I can move from design intent to production planning.

The mistakes I try to avoid

There are a few mistakes I watch for when designers start learning architecture.

The first is over-specifying implementation. Understanding architecture does not mean dictating every internal component decision. Engineers need room to choose the right implementation. The design should specify behavior, constraints, and product intent.

The second is using technical language as decoration. Saying "state machine" or "server component" does not make the work stronger if the page does not explain the user behavior. Technical language should clarify the decision, not make the artifact sound smarter.

The third is treating constraints as excuses. "That is hard to build" should not automatically kill the better product experience. It should trigger a tradeoff conversation: what is hard, why, what simpler version preserves the promise, and what would we learn from shipping it?

The fourth is forgetting taste. Architecture knowledge should not make the interface colder. The best work still needs hierarchy, rhythm, tone, and restraint. The architecture helps the product survive; it does not replace design craft.

The balance is the skill. I want to understand enough engineering to make the design real, and keep enough design judgment to make the implementation worth shipping.

The strongest visual for this topic

If I were turning this article into a case-study asset, I would build one visual that maps a single screen across layers.

The top row would show the user surface: heading, controls, table, empty state, and action. The second row would show the component layer: table shell, filter group, status chip, drawer, and form field. The third row would show the data layer: query, permissions, status enum, validation, and analytics event. The final row would show release proof: browser checks, error states, and the metric watched after launch.

That visual would communicate the whole argument quickly. Frontend architecture is not separate from design. It is the structure that lets the design behave correctly when real users, real data, and real failures arrive.

It would also show how I think under constraint. A polished screen proves taste, but a layered architecture visual proves I understand what has to be true for that screen to survive production. That is the stronger hiring signal for the kind of product engineering work I want.

It gives the reviewer evidence that I can move from critique to implementation without losing the product reason the screen exists in the first place, under real delivery pressure.

The architecture questions I want designers to ask

Designers do not need to know every framework detail. But they should ask better questions:

  • What data states exist?
  • What happens when this action fails?
  • Is this route shareable?
  • Does this component already exist?
  • What variant would make this reusable?
  • What is the longest realistic content?
  • What does mobile do with this density?
  • How does keyboard focus move?
  • What does the API call this state?
  • What do we log when the user completes this action?
  • Is this temporary or a new pattern?
  • What needs to be tested before release?

Those questions change the work. They make design more buildable and implementation more product-aware.

The hiring signal

For my own positioning, this is one of the clearest signals I can show. I am not only a designer who can talk to engineers, and not only an engineer who can push pixels. I can reason about the product surface as a system.

That means I can design the screen, understand the state, ask about the data, build the component, test the interaction, and write the release note. That is the bridge companies need when teams are small and product surfaces have to ship without losing taste.

Companion artifacts

Use this after reading.

Practical downloads and templates that turn the article into something you can bring into a product review, implementation pass, or agent workflow.

DownloadJun 2026

Design-to-Code Handoff Checklist

A handoff checklist for turning Figma screens into build-ready components, tokens, states, and responsive requirements.

FigmaFrontendSystems
View details
DownloadJun 2026

Front-End State Recipes

Reusable recipes for optimistic actions, loading, empty, error, data-transition, and disabled-control states.

FrontendStatesUX
View details
RepoJun 2026

React Dashboard Shell

A polished React dashboard starter with sidebar navigation, metrics, filters, tables, detail panels, and reusable UI states.

ReactTypeScriptDashboard
View details