UI Design Best Practices for Effective Interfaces

Mixed-media illustration: a real steel robotic arm hanging from the top edge lifts a glossy drawn app screen with a big "Pay now" button like a lid, revealing a drawn flow underneath where the arrow from "Pay now" stops at an orange-outlined gap before a box labelled "Receipt".
Noah Chen
Product & Client Success Manager, ANODA
Published
26 min read
17 sections

In short

Effective UI is not a prettier screen. It makes four things visible: what matters most, what state the product is in, what the user can do next and what happens when they do it. Here is how we separate UI problems from broken flows and engineering bugs, the review questions we use instead of taste, and the states, forms, tables, accessibility and handoff checks that decide whether a paid-for user gets anywhere.

In this article
  1. What effective UI actually has to show
  2. Is it a UI problem, a flow problem or an engineering problem?
  3. The review that replaces taste: goal, state, action, response, recovery
  4. Visual hierarchy: make priority impossible to miss
  5. Navigation and information architecture: signposts for the task
  6. Labels, content and affordances: say what happens, look like what it is
  7. Consistency and design systems: same problem, same answer
  8. States are the interface: loading, empty, error, permission, success
  9. Feedback, waiting and performance: every action gets an answer
  10. Forms and mistakes: prevent, explain, keep the input
  11. Data-heavy interfaces: tables, filters and bulk actions
  12. Responsive layouts and platform conventions
  13. Accessibility is UI quality, not a compliance layer
  14. Motion: a signal, not a show
  15. Handoff and verification: where good UI goes to die
  16. A UI design checklist you can run this week
  17. Where your problem belongs

The best practices for UI design are not about making screens pretty. An effective interface makes four things obvious at a glance: what matters most right now, what state the product is in, what the user can do next and what will happen when they do it. Hierarchy, contrast, typography, spacing and components are the tools for showing those four things. They are not a replacement for them. When the logic underneath is missing, no amount of polish will put it back.

At ANODA, we fix product interfaces from the task outward, and the plot never changes. A team spends a quarter on a redesign: new colours, new icons, a fashionable font. The launch post is gorgeous. Three weeks later the support queue looks exactly the same, because users still cannot tell whether their invoice was sent or what “Process” does. You cannot make a silk purse out of a sow’s ear, and you cannot make a broken flow effective by giving it a nicer button.

Meanwhile the money keeps leaking. Every user who signs up, gets lost on the second screen and leaves is a user you paid to acquire: ads, sales calls and onboarding emails spent to deliver a person to an interface that does not tell them what to do. AI has not changed the plot either. It now takes an afternoon to generate forty polished screens, every one of them missing the same empty state. Here is how to design user interfaces that stop the leak instead.

What effective UI actually has to show

User interface design best practices get sold as commandments: be consistent, be simple, use white space. All true, and useless without the reason. Every screen exists to answer four questions for the person looking at it.

  • Priority. What on this screen matters most to me right now?
  • State. Where is my work: draft, pending, failed, done, locked, waiting on someone else?
  • Action. What can I do next, and which of those actions is the main one?
  • Consequence. What will happen when I press this, and can I take it back?

An interface that answers all four is effective, even if it is plain. An interface that answers none of them is decoration, however many design awards it collects.

Picture a freshly tiled bathroom: Italian stone, designer taps, a gorgeous rain shower. The drain is on the wrong side of the floor, so every shower ends with a puddle by the door. Nobody praises the tiles after the second puddle. That is what a visual redesign on top of missing product logic looks like: expensive surfaces, and the water still goes the wrong way.

So the first UI design principle is uncomfortable for anyone selling visual polish, agencies included: check the floor plan before you touch the surface. And empty, loading, error, permission and success states are part of that plan, not garnish. A screen designed only for the happy moment is not designed. It is a photo of the one day nothing went wrong.

Is it a UI problem, a flow problem or an engineering problem?

Most teams that ask us for “a UI refresh” do not have a UI problem, or not only one. They have a symptom and have picked the cheapest-sounding cure.

A limp can come from a stone in the shoe, a bad knee or a problem in the spine. A new pair of trainers fixes the first, does nothing for the second and makes the third worse, because now the patient walks further before anyone looks at the X-ray. Interfaces are the same. The symptom tells you where it hurts, not which layer is broken.

Mixed-media illustration: a drawn cracked app screen stands on paper between three drawn toolboxes labelled “UI”, “Flow” and “Code”; a real steel arm holds a real stethoscope against the screen, and the “Flow” toolbox is ticked in lime while the crack is outlined in orange.
Listen before you prescribe. The crack is on the screen; the cause usually isn't.

Here is the first pass we run before anyone opens a design file:

Symptom Likely a UI problem when… Likely a flow or UX problem when… Likely an engineering problem when…
Users miss the main action The action exists but is visually buried or looks like plain text The action they need is not on this screen at all The button renders below the fold on common screen sizes
Users make the same mistake The label or format hint is ambiguous The step asks for information they do not have yet Validation rejects valid input
Users think nothing happened There is no visible feedback after the click The result lands somewhere they would never look The request fails silently or times out
Support tickets ask “where is…” Labels use internal names The information architecture does not match the task Search does not index that content
The screen feels slow Nothing shows progress The user waits for work they did not need Responses are slow or the page blocks the main thread
A diagnosis board with three columns: UI quality, flow and logic, and engineering. Under UI quality: the main action looks like plain text, the status is shown by colour only, and the label says “Process”. Under flow and logic: the step asks for a VAT number users do not have yet, and the invoice is sent but lands in an archive nobody opens. Under engineering: valid postcodes are rejected, save fails silently, and the list takes 6 seconds to load. Each column names its owner.
Illustrative example: the same complaint, three different broken layers, three different owners and three different bills.

Each layer has a different owner and a different price tag. A UI fix is days of design and front-end work. A flow fix means research and new logic. An engineering fix may not need a designer at all. Send the wrong team and you pay twice for the same screw-up, while acquisition spend keeps pouring users into the same hole.

Audit check

For your top five complaints (tickets, drop-off points, session recordings), write down which layer each one lives in before you commission any redesign.

Failure evidence

The redesign brief lists colours, fonts and “modern look” and no user task. Nobody can say which complaint the new UI will remove.

Correction pattern

Fix engineering defects first, validate the flow second, and only then polish the UI that carries it.

The review that replaces taste: goal, state, action, response, recovery

“I don’t like it” is not a review. Reviews driven by taste end with the most senior person in the room winning, and the user is never in the room.

Look at an airport departure board instead. Nobody calls it beautiful, and it works. It knows your goal (catch a flight). It shows the state (on time, boarding, delayed, cancelled). It tells you the action (go to gate B12). It responds when things change (the row flips to “Gate closed”). And when the flight is cancelled, it points to recovery (“See agent at desk 4”). Five jobs, no gradients.

That is the framework we review every screen against, and each question can be checked rather than argued about:

  • User goal. Can a first-time user say, within five seconds, what this screen is for and what they came to do?
  • Current state. Does the screen show where the user’s work stands — and does it look different when the state is different?
  • Available action. Is the main action the most visible thing, and are unavailable actions explained instead of silently missing?
  • System response. After every action, does the interface show that something happened, what happened and where the result went?
  • Recovery path. When something goes wrong — wrong input, no permission, failed request, changed mind — is there a visible way back?
A Fernhill invoice screen for INV-0142 to Marlow & Finch, £2,400.00, next to five review questions: goal (get paid for March work), state (sent 3 April, overdue 12 days), action (Send reminder as the one filled button), response (reminder sent at 14:32, next reminder on 6 May) and recovery (Undo reminder, and editing creates a new version).
Illustrative example: five questions, five things you can point at on the screen. If you cannot point at one, that is the defect.

Run them on one screen and “make the button pop” becomes “the reminder was sent, but nothing on the screen says so”. That is a defect with an owner, not an opinion with a job title.

Visual hierarchy: make priority impossible to miss

Visual hierarchy is the order in which the eye reads a screen. Size, weight, contrast, position and space decide what gets noticed first, second and never. When everything is equally loud, nothing is.

Imagine a weather forecast where “light drizzle” and “hurricane warning” use the same small grey icon in the same row. Technically all the information is there. Practically, someone is going to leave their windows open. Interfaces do this constantly: the overdue total sits in the same tile as “Invoices this year”, and the one number that needs a decision is lost among six that need nothing.

Mixed-media illustration: a drawn weather board holds two equal cards reading “Light drizzle” and “Sunny spells” beside an empty slot circled in orange; a real steel arm entering from the left on a wall bracket sets a bigger “Hurricane warning” card, outlined in lime, on top of the others.
Same data, different order. Only one of these cards should make you close the windows.

The fix is not “make it bigger”. It is deciding what matters, then spending visual weight like money:

  • One primary action per view. One filled button. Everything else is secondary or a link. Two primary buttons means the team did not decide, and the user now has to.
  • Size and weight for priority, not for decoration. The number that drives a decision gets the headline treatment. Totals nobody acts on get small type.
  • Contrast for importance. Muted text for supporting detail, full contrast for what the user must read. Never mute something the user needs to act on.
  • Space to group. Items that belong together sit closer to each other than to anything else. Spacing does the job borders usually do badly.
Before and after, illustrative example: before, a Fernhill overview with six equal tiles (invoices this year 184, clients 42, drafts 3, overdue £4,860, paid this month £12,300, average payment 18 days) and two equal buttons; after, one headline “£4,860 overdue from 3 clients” with a Send 3 reminders button, the three clients listed with amounts adding up to £4,860, and the other figures in a small secondary row.
Illustrative example: six equal tiles make the user do the triage. One headline and one button do it for them.

A test we use in every audit: blur the screenshot and see what survives. If the blur leaves a logo and a webinar banner, your hierarchy is advertising, not helping. Typography does most of the lifting and does not need to be clever: two typefaces at most, a few sizes with clear steps, real headings instead of bold paragraphs.

Audit check

On each key screen, write down the one thing a user must notice first and the one action they should take. Then blur the screen and see whether those two things survive.

Failure evidence

More than one filled button. Headline-sized numbers nobody acts on. Destructive actions styled like primary ones.

Correction pattern

Assign one primary action per view, demote everything else, and reserve size, weight and contrast for what drives the next decision.

Information architecture decides where things live and what they are called; navigation is the signage. Both fail the same way: they mirror the org chart instead of the user’s task.

Walk into a hospital with a bleeding hand and the signs say “Whitfield Wing”, “Harcourt Building” and “Level 2 East”. Every sign is accurate. None tells you where A&E is. Now look at a typical sidebar: “Ledger Core”, “AR Hub”, “Docs Engine”. These are the names of the teams that built each area. The user wanted to send an invoice.

Mixed-media illustration: a drawn signpost at a crossroads has three arrows reading “AR Hub”, “Ledger Core” and “Docs Engine”, outlined in orange; a real steel arm hangs a new drawn arrow outlined in lime reading “Send an invoice” at the top of the post.
Every sign is accurate. None of them goes where the user is going.

Good navigation answers three questions on every screen: where am I, where can I go, how do I get back. In practice:

  • Label by task or object, in the user’s words. “Invoices”, “Expenses”, “Clients”, “Reports”. If you need a glossary for your menu, the menu is wrong.
  • Show the current location. Highlight the active section, match the page title to the menu label, add breadcrumbs for deep hierarchies.
  • Keep the top level short. A sidebar with 19 items is not navigation; it is a sitemap. Group, and move rare destinations into settings or search.
  • Put the next step where the task ends. After “Invoice sent”, the user wants to see it in the list or send another, not hunt for the section again.
Before and after, illustrative example: before, a sidebar with internal module names (Dashboard, Ledger Core, AR Hub, Docs Engine, Workflows, Integrations, Admin) and a page titled “AR Hub › Items”; after, a sidebar with Home, Invoices (3 overdue), Expenses, Clients, Reports and Settings, with Invoices highlighted and the page titled “Invoices”.
Illustrative example: the same product, navigated by org chart and by task. Only one of them needs a training session.

If you do not know how users group the things in your product, card sorting and tree testing will tell you faster than another workshop. And if the navigation must change because the product’s jobs changed, that is a flow problem in a UI costume, and it needs discovery, not a new icon set.

Audit check

Give five new users a task (“find the invoice you sent Marlow & Finch last month”) and watch where they click first. Compare your menu labels with the words they use when they describe the task.

Failure evidence

First clicks spread across several sections. Menu labels that match team names. Support answers that start with “go to Settings, then…”.

Correction pattern

Rename sections by task or object, show location on every screen, cut the top level down and put the next step where each task ends.

Labels, content and affordances: say what happens, look like what it is

Words are interface. Many UI problems we find in audits are not layout problems at all: labels that describe nothing, confirmations that explain nothing, controls that do not look like controls.

Think of a spice rack where every jar carries the same handwritten label: “Spice”. You can cook with it. You will just find out which jar was chilli the hard way. A product full of “Submit”, “OK”, “Process” and “Continue” buttons is that rack, and the dish that comes out is usually crap. The user cannot predict what happens, so they guess, and guessing on a screen that emails customers is how support tickets are born.

Mixed-media illustration: a drawn spice rack holds identical jars labelled “Submit”, “OK”, “Process” and “Continue”, outlined in orange; a real steel arm holds up one small real glass jar with a lime label reading “Send invoice”.
Four jars, four identical labels. You find out which one was chilli the hard way.

The rules for UI content are short and routinely ignored:

  • Buttons say what they do: verb plus object. “Send invoice”, “Save draft”, “Delete client”. The label on the button should match the result the user sees afterwards.
  • Confirmations name the consequence, not the feeling. “Are you sure?” asks the user to be confident. “Delete INV-0142? The client’s payment link will stop working” asks them to decide, and gives them what they need to do it.
  • The safe option is not the one you are trying to get rid of. In a destructive dialog, the button that keeps the data reads “Keep invoice”, not “Cancel”, which could mean either.
  • Use the user’s vocabulary. “Remittance advice” is correct in accounting and baffling to a two-person design studio sending its third invoice.
Before and after, illustrative example: before, a dialog titled “Are you sure?” with the text “This action cannot be undone” and buttons OK and Cancel; after, a dialog titled “Delete invoice INV-0142?” explaining that Marlow & Finch’s payment link will stop working and the £2,400.00 invoice will be removed from reports, with buttons “Keep invoice” and “Delete invoice”.
Illustrative example: “Are you sure?” asks for courage. Naming the object and the consequence asks for a decision.

Affordance is the other half: whether something looks like what it is. Everybody has met the door with a big handle that you have to push. Interfaces build those doors all day. Links look like plain text. Status chips look like buttons and do nothing. Row actions appear only on hover, so on a touch screen they do not exist, and on desktop they are out of sight, out of mind.

Before and after, illustrative example: before, an invoice row where the client name is plain grey text that is actually a link, a status chip “Overdue” is styled like a button but does nothing, and actions appear only on hover; after, the client name is an underlined link, the status is a flat label with an icon, and a visible “Send reminder” button plus a More menu sit at the end of the row.
Illustrative example: if it can be clicked, it should look clickable. If it cannot, it should stop pretending.

Chekhov had a rule for playwrights: if a gun hangs on the wall in the first act, it must go off by the third. Interfaces need the reverse rule too. If something looks like a button, it must do something. If it does something, it must look like it.

Audit check

List every button label and every confirmation dialog in one key flow. For each, ask: can a user predict the result from the words alone?

Failure evidence

Generic labels (“Submit”, “OK”, “Process”). “Are you sure?” dialogs. Clicks on non-interactive elements in session recordings. Hover-only actions.

Correction pattern

Rewrite labels as verb plus object, name the object and consequence in confirmations, and make interactive and static elements visually distinct everywhere.

Consistency and design systems: same problem, same answer

Consistency is not everything looking the same. It is the same problem getting the same answer, so users learn a behaviour once.

A stop sign looks the same in almost every country. Nobody reads it; drivers stop, because they learned the shape once and it never lies. Now picture a city where every district designs its own stop sign. That is a product where “Delete” asks for confirmation in one module, deletes instantly in another and quietly archives in a third. Each team made a reasonable choice. Together they made a mess nobody can predict, and the damage is death by a thousand cuts: a hesitation here, a wrong click there. Unifying modules like that was the core of our Superstream work.

Before and after, illustrative example: before, “Delete” behaves three different ways in one product — in Invoices it opens “Are you sure?”, in Clients it deletes instantly with no undo, and in Expenses it archives without saying so; after, one rule for the whole product — reversible actions happen immediately with an Undo for 10 seconds, irreversible actions ask for confirmation naming the object, and archive is always labelled “Archive”.
Illustrative example: three teams, three reasonable decisions, one product nobody can predict.

But consistency is not a religion. Fire engines are not painted like buses, because they must stand out. An irreversible action or a security warning should break the pattern deliberately, so the user notices. Deliberate variation has a reason written next to it. Accidental variation is drift.

That is the job of a design system: not a library of pretty buttons, but shared decisions that keep the product predictable as it grows:

  • Foundations (tokens): colour, type scale, spacing, radius, elevation, motion timing. One source, used by design and code.
  • Components: buttons, inputs, tables, dialogs, toasts — each with every state designed: default, hover, focus, active, disabled, loading, error.
  • Patterns: recurring situations — destructive actions, empty lists, bulk edits, form errors.
  • Rules and governance: when to use what, who can add a component and how exceptions get approved.
A design system component card for the Fernhill button: four variants (primary, secondary, ghost and destructive), seven states (default, hover, focus with a visible ring, pressed, loading with “Sending…”, disabled with a reason shown nearby, and success “Sent”), and usage rules: one primary button per view, labels are verb plus object, destructive buttons only inside a confirmation that names the object.
Illustrative example: a component is not a picture of a button. It is every state the button can be in, plus the rules for when to use it.

The money case is blunt. Without shared components every team rebuilds the same date picker and table, with its own bugs, and you pay for each version in design, engineering, QA and support. With them, one fix ships everywhere. We go deeper into how components, patterns and rules fit together in our guide to design system components, and into the principles behind them in UI/UX design principles for better digital products.

Audit check

Pick three common actions (delete, save, filter) and trace how each behaves across every module of the product.

Failure evidence

The same action with different confirmations, labels or undo rules. Several versions of the same component in the code. Exceptions nobody can explain.

Correction pattern

Write one pattern per recurring situation, build components with every state, and document which exceptions are deliberate and why.

Design systems

Five teams, five date pickers, one confused customer?

We turn the decisions your product keeps re-making into shared components, patterns and rules, so every team ships the same behaviour without a weekly alignment meeting.

Stop rebuilding the same button

States are the interface: loading, empty, error, permission, success

Most design files show one moment: a full account, every permission, a fast network. Real products spend most of their life in other states, and that is where users decide whether to stay.

A washing machine with no display is a box that hums. Washing? Finished? Stuck? You open the door to check and get a wet floor. A screen without designed states is that machine: the user presses a button, it hums, and they guess.

Mixed-media illustration: a drawn washing machine whose round door is a screen showing only a spinner, with a drawn puddle spreading across the floor outlined in orange; a real steel arm attaches a small lime drawn display above the door reading “Rinse · 12 min left”.
A spinner is a machine that hums. A state tells you what it is doing and when it will stop.

Here is the minimum set of states we design for every screen that shows data or accepts an action:

  • Loading. A skeleton of the layout, not a spinner on a white page.
  • Empty, first use. The most expensive screen in your product. “No invoices” and nothing else is a blank page handed to someone who is paying you. Say what will appear here and offer the first step.
  • Empty, no results. The user has data but the filter found nothing. Say which filter and offer to clear it.
  • Error. What failed, whether the data is safe, what to do next. Never lose input.
  • Permission. Explain why the user cannot act and who can, instead of hiding the button.
  • Partial and stale. Say what loaded, what did not and when.
  • Success. What happened, where the result went, the natural next step.
  • Role-specific. An admin, an accountant and a viewer see the same screen differently. Design each version, not just the admin’s.
Three states of the Fernhill invoice list, illustrative example: loading, shown as a skeleton of the table layout with the heading “Invoices” already visible; first use, saying invoices you send will appear here with payment status, with buttons Create your first invoice and Import from a spreadsheet; and no results, saying no invoices match Status: Paid and Client: Oakridge Studio, with a button to clear the Status filter.
Illustrative example: “No invoices” is three different situations. Each one needs its own sentence and its own next step.
Three more states of the same list, illustrative example: an error saying the invoices could not be loaded, your data is safe, with a Try again button and a time of the last successful update; a permission state for a viewer role saying only admins can send invoices, naming Priya Shah as the account admin, with a Request access button; and a success state saying INV-0143 was sent to Bluebell Dental for £980.00, due 13 May, with View invoice and Create another buttons.
Illustrative example: an error that says the data is safe, a permission state that names who can help, a success that says what happened next.

Each state costs little to design and a lot to leave out. The empty state alone decides whether a paid-for sign-up becomes an active user or a line in next month’s churn report. A permission state without a name becomes a support ticket, paid for with a person’s time.

Audit check

For each key screen, list the states above and find the design for each. Then create a brand-new account, a viewer-role account and an account with a failed import, and look at the screens.

Failure evidence

Designs exist only for the full, happy state. “No data” as the whole empty state. Buttons that disappear without explanation for some roles.

Correction pattern

Make the state list part of the definition of done for every screen, and design first-use and error states before the happy path is signed off.

Feedback, waiting and performance: every action gets an answer

Every action deserves a response the user can see. Without one, people press again, and your support team gets to explain the two invoices that went out.

A forecast that says “weather is coming” is never wrong and completely worthless. A spinner is that forecast: something is happening, no idea what or for how long. Users can live with waiting. They cannot live with not knowing.

Response-time thresholds are old enough to vote. Jakob Nielsen described them in 1993, and Nielsen Norman Group still publishes them: about 0.1 seconds feels instant, about 1 second keeps the train of thought intact, and about 10 seconds is the limit of attention before people need progress feedback. The web has since added its own yardstick. As of 2026, Google’s web.dev guidance treats Interaction to Next Paint (INP) of 200 milliseconds or less, measured at the 75th percentile, as good responsiveness; INP replaced First Input Delay as a Core Web Vital on 12 March 2024.

A timeline of waiting, illustrative example: under 0.1 seconds, show the result, here a “Paid” label; about 1 second, the button itself shows “Saving…”; up to 10 seconds, a progress bar reads “Importing 1,240 of 3,000”; over 10 seconds, the job runs in the background with “We’ll notify you” so the user can leave. Thresholds from Jakob Nielsen, 1993, published by Nielsen Norman Group.
Illustrative example: four waiting times, four different answers. A spinner is the right answer to none of them over a second.

So the design rules follow the clock:

  • Instant feedback on every press. The button changes state immediately, even if the work takes longer.
  • Progress for anything over a second or two, with real numbers when you have them (“1,240 of 3,000”), not a bar that loops forever.
  • Background jobs for long work. Let the user leave and tell them when it is done.
  • Confirmation with a time and a place. “Saved at 14:32” beats a toast that says “Success!” and vanishes before anyone can read it.
Before and after, illustrative example: before, a spinner in the middle of a blank panel above a Save button that has been clicked three times with no change; after, the header says “Saved at 14:32” with an Undo link, and a long import shows “Importing 1,240 of 3,000 transactions” with a progress bar and a note that the user can leave the page.
Illustrative example: a click that gets no answer gets clicked again. Tell the user what happened and when.

Perceived performance is partly a design decision: skeletons and instant button states make the same product feel faster. But design cannot hide a slow back end. A list that takes six seconds to load belongs in the engineering backlog, not in a prettier loading animation.

Audit check

Record yourself using the product on an ordinary laptop and a mid-range phone on mobile data. Note every click that got no immediate visible response, and every wait over a second without progress.

Failure evidence

Double submissions in the logs. Spinners on blank pages. Toasts that disappear before they can be read. Tickets asking “did it go through?”

Correction pattern

Give every action an instant visible response, show progress with real numbers for longer work, move long jobs to the background and send slow responses to engineering.

Forms and mistakes: prevent, explain, keep the input

Forms are where products take something from the user: data, money, time. They are also where most avoidable mistakes happen, and most products respond like a bad examiner.

Imagine getting your exam back with “FAIL” stamped across the top and no marks next to any question. Now sit it again from memory, because the paper has been shredded. That is a form that shows “There were errors with your submission” at the top, highlights nothing and clears half the fields.

Mixed-media illustration: a drawn exam paper with questions “Company name”, “VAT number” and “Postcode” has a big orange stamp reading “Error” across the top and no marks beside any question; a real steel arm holds a real pencil and writes a small lime note next to “VAT number”: “Use GB + 9 digits”.
A stamp tells you that you failed. A note next to the question tells you how to pass.

Error handling in forms comes in three layers, in this order:

  • Prevent. Ask only for what you need now. Use sensible defaults, formats shown before typing (“GB followed by 9 digits”) and choices instead of free text where options are known. Do not ask for the same thing twice: WCAG 2.2 (success criterion 3.3.7, Redundant Entry) expects information already entered in the same process to be filled in or available to select.
  • Explain. Validate at the right moment — usually when the user leaves a field, not on every keystroke and not only on submit. Put the message next to the field, say what is wrong and how to fix it, and use the user’s words: “You typed 8 digits; a UK VAT number has 9”.
  • Keep. Never clear valid input because another field failed. Save long forms as drafts. After a failed submission, move focus to the first problem and list the issues at the top with links to each field.
Before and after, illustrative example: before, a Fernhill new-client form with a red banner “There were errors with your submission”, no field marked and the VAT number and postcode fields emptied; after, the VAT number field keeps the typed value GB12345678 with the message “You typed 8 digits after GB. A UK VAT number has 9.”, the postcode keeps its value, and a note says the draft was saved at 10:14.
Illustrative example: one generic banner and emptied fields, or one specific sentence next to the field that needs it.

For destructive actions, prefer undo over “Are you sure?” wherever the action can be reversed. A confirmation on every action trains users to click “Yes” unread, and then it protects nothing on the day it matters.

The money here is direct. A sign-up form that loses input on error loses the user. A checkout that rejects a valid postcode loses the sale, and with it every ad that brought that buyer in.

Audit check

Fill in each key form badly on purpose: wrong formats, missing fields, a failed network request halfway through. Watch what the form keeps, what it says and where it puts focus.

Failure evidence

Generic error banners. Cleared fields. Errors shown only after submit. The same data requested twice in one flow.

Correction pattern

Cut fields, show formats up front, validate on leaving the field, write specific messages next to the problem and keep every valid input.

Data-heavy interfaces: tables, filters and bulk actions

B2B products live in tables, and most tables are designed as if the user will read every row, when they are looking for three.

A coach reviewing Saturday’s goals should not have to watch all 90 minutes on fast-forward; someone tags the goals and he jumps straight to them. A table with no default sort, no visible filters and fourteen equal columns is untagged match footage. Every answer is in there. Finding it costs an afternoon.

What makes data-heavy UI work:

  • Choose columns for the decision, not for completeness. Client, amount, status and due date answer most questions about invoices. Internal IDs and timestamps can live in the detail view.
  • A sensible default sort, visibly marked. Overdue first, newest first — whatever serves the most common task — with the sort direction shown in the header.
  • Filters as visible chips with a result count. “Status: Unpaid · 5 of 412 invoices” tells the user where they are and how to get back.
  • Readable numbers. Right-aligned amounts, consistent decimals, currency stated once.
  • Sticky headers for long tables, so users never lose track of what a number means.
Before and after, illustrative example: before, an invoice table with 12 columns including internal IDs and timestamps, truncated client names, left-aligned amounts with mixed decimals and no sort indicator; after, five unpaid invoices with client and status in words, right-aligned amounts in pounds and due date, sorted by due date with an arrow, under a filter chip “Status: Unpaid” showing 5 of 412 invoices.
Illustrative example: twelve columns because the database has them, or five because the user needs them.

Bulk actions are where tables get dangerous. Voiding 48 invoices with one click is powerful and, without a preview, reckless. Show what will change, skip what cannot change and say why, and give the user a way back.

Before and after, illustrative example: before, 48 imported invoices selected and a Void button that runs immediately, with no preview and no undo; after, a preview panel saying 45 of the 48 selected invoices will be voided and 3 are skipped because they are already paid, with the skipped invoices listed, a note that voided invoices can be restored for 30 days, and buttons “Void 45 invoices” and “Cancel”.
Illustrative example: a bulk action that says what it will do, what it will skip and how to undo it.

Audit check

Ask three real users to find a specific record and to change ten records at once. Time both tasks and note every column they ignore.

Failure evidence

Users export to a spreadsheet to answer simple questions. Columns nobody reads. Bulk actions without preview or undo. Filters that reset when the user opens a record and comes back.

Correction pattern

Cut columns to the decision, set a visible default sort, show filters as chips with counts, keep filters across navigation and add preview and undo to bulk actions.

Responsive layouts and platform conventions

Responsive design is not squeezing the desktop layout onto a phone. It is deciding what matters on each screen size.

A recipe for twelve does not become a dinner for one by serving it on a smaller plate. You change the portions, and sometimes the menu. A 12-column table on a 390-pixel screen is dinner for twelve on a saucer: all there, and unreadable. On a phone the invoice list becomes cards with the four facts that matter and one clear action.

Before and after, illustrative example on a phone: before, the desktop invoice table shrunk onto the screen with tiny text and a horizontal scrollbar; after, a filter chip “Overdue · 3” above three invoice cards, each showing client, amount, invoice number, due date and status in words, with a “Send reminder” button on the first.
Illustrative example: the same list for a phone. Not smaller — rearranged around what the user checks on the move.

Platform conventions matter as much as screen size. Feed a cat dog food and it will eat it, grudgingly, and look at you as if you have lost your mind. iPhone users served Android patterns, or web users served a fake mobile app inside a browser, react the same way. Back gestures, date pickers and share sheets are learned behaviour. Break them and every user relearns something they already knew, for no gain.

Touch changes the physical rules too. Fingers are less precise than cursors, and the platform owners publish numbers for it. As of 2026, Apple’s design tips recommend controls of at least 44 × 44 points, Android’s accessibility guidance recommends touch targets of at least 48 × 48 dp, and WCAG 2.2 (success criterion 2.5.8, level AA) sets a floor of 24 × 24 CSS pixels for pointer targets, with some exceptions for spacing and inline links.

Before and after, illustrative example on a phone: before, the INV-0142 detail screen with a row of four small icon-only buttons crammed together and a tiny text link “void”; after, the same screen with a full-width “Send reminder” button, “Download PDF” and “Edit” as labelled secondary buttons, and a “More” button for the rarer actions.
Illustrative example: four icons the size of a fingernail, or three labelled buttons a thumb can actually hit.

Audit check

Complete your three most common tasks on a real phone, one-handed, and on a tablet in both orientations. Check tap targets against your platform’s guidance.

Failure evidence

Horizontal scrolling on phones. Hover-dependent actions on touch devices. Custom controls replacing native ones for no reason. Mis-taps on neighbouring buttons.

Correction pattern

Prioritise content per breakpoint, redesign tables as cards where needed, follow platform conventions by default and size targets to the platform’s guidance.

Accessibility is UI quality, not a compliance layer

Accessibility is usually sold as compliance: a checklist run before release by someone who missed the design meetings. By then the problems are baked into every component.

A shop with a step at the door does not only lose wheelchair users. It loses parents with prams, travellers with suitcases and the courier with a trolley. Low contrast, colour-only status and keyboard traps work the same way: they hurt people with disabilities most, and also the user in bright sunlight, the accountant with tired eyes at 11 p.m. and the power user who never touches the mouse.

The core requirements are well documented. WCAG 2.2, the W3C Recommendation (current edition dated 12 December 2024), asks for a contrast ratio of at least 4.5:1 for normal text and 3:1 for large text, at least 3:1 for the visual parts of interface components and meaningful graphics, text that can be resized to 200 percent without losing content or function, and — our favourite, because it is broken in almost every product we audit — colour never being the only way information is conveyed.

Before and after, illustrative example: before, three invoices with statuses shown only as coloured dots, pale grey text on white at a contrast ratio of about 2.3:1 and a colour legend underneath; after, the statuses written out as “Overdue 12 days”, “Paid” and “Draft” with an icon each, secondary text at about 6.4:1 and a visible focus ring around the selected row.
Illustrative example: three coloured dots and a legend, or three words. Only one of them still works in sunlight, in greyscale and for anyone who can't tell the dots apart.

There is also a harder commercial edge now. The European Accessibility Act has applied since 28 June 2025, and the European Commission lists banking services and e-commerce among the services that must be accessible. If you sell into the EU, inaccessible UI is no longer only lost users. It is legal exposure.

Built in from the start, most of this costs almost nothing. Bolted on at the end, it means touching every screen twice. Our full take on inclusive products is in the guide to accessibility in UX design.

Audit check

Check text and control contrast in your palette, navigate one full task with the keyboard only, zoom the browser to 200 percent and view one key screen in greyscale.

Failure evidence

Status shown by colour alone. Focus rings removed “because they look ugly”. Inputs with placeholder text instead of labels. Content cut off at 200 percent zoom.

Correction pattern

Fix contrast at token level, pair colour with text or icons, restore visible focus, label every input and build these rules into the design system’s components.

Motion: a signal, not a show

Motion earns its place when it explains a change: where something went, what caused what. Everything else is choreography the user sits through.

Watch a goalkeeper make a full flying dive for a ball rolling straight into his hands. It looks spectacular in the highlights and adds nothing to the save. Interfaces do it with a bounce on every card and confetti after saving a draft. Charming once. Too clever by half on the fortieth time that day.

A three-frame storyboard, illustrative example: the row “INV-0139 Oakridge Studio · Paid” is selected and Archive is clicked; at about 200 milliseconds the row shrinks and moves toward the Archive item above it; once settled, the Archive counter reads 12 instead of 11 and an “Archived · Undo” message appears. A note underneath shows the reduced-motion version: the row disappears instantly and the counter and message still update.
Illustrative example: motion that answers “where did it go?”, and the reduced-motion version that answers it without moving anything.

Rules we apply to motion in product UI:

  • Every animation has a job: showing where something came from or went, linking cause and effect, or drawing attention to a change the user would otherwise miss.
  • Short and quick to settle. Motion in frequent interactions should be over before the user notices waiting for it.
  • Never block input. The user should be able to act while an animation runs.
  • Respect reduced motion. Browsers expose the operating system’s reduced-motion setting through the prefers-reduced-motion media query, documented on MDN. Honour it with instant or gentler alternatives.

Motion is also where design intent gets lost first: timing that looked right in a prototype stutters on a mid-range phone. Specify it and check it in the real build.

Handoff and verification: where good UI goes to die

One system across the task

The costly UI problem is often a broken agreement: the list uses one status, the details another, and the confirmation never tells the user what happened. A colour refresh preserves that confusion. ANODA works through the complete task and makes the hierarchy, states and component rules agree before they reach development.

In SEOSpace, we designed the web app and Chrome extension around consistent scores and prioritised SEO tasks, then carried the decisions into Figma handoff, Loom walkthroughs and release design QA. Users get a clear next action across connected surfaces. Explore the SEOSpace redesign and design a coherent interface with ANODA.

A design is finished when the product behaves right, in every state, on real devices, not when the file looks right. Between the two sits handoff, where we see the most expensive losses.

On a building site, handover comes with a snagging list: a walk through every room noting the sticking door and the crooked tile. Nobody moves in until the snags are fixed. Most software is handed over with a picture of the living room and nothing about the fuse box or the fire exit. The engineer fills the gaps with guesses, and many guesses become support tickets.

Mixed-media illustration: a drawn app screen sits on a drawn building-site table beside a clipboard titled “Snag list” with the items “Empty state”, “Error” and “Focus”, two of them outlined in orange; a real steel arm lays a real spirit level across the drawn screen, whose bubble sits off-centre over a crooked button.
Nobody moves into a house without walking through it first. Somehow, products ship that way every week.

A handoff that survives implementation includes:

  • A state inventory for each screen: loading, empty, no results, error, permission, partial, success, and each role’s version.
  • Behaviour, not only pictures: what happens on click, on failure, on slow network, on double submit, on back.
  • Content rules: real labels, error messages and edge cases like the 60-character client name and the £1,000,000.00 amount.
  • Acceptance criteria the developer and QA can check: “focus moves to the first invalid field”, not “errors are handled nicely”.
  • Components from the design system, named the same way in design and code.
A handoff sheet for the Fernhill invoice list, illustrative example: a state inventory with loading, first use, no results, error, viewer role, one invoice, 500 invoices, a 60-character client name and a £1,000,000.00 amount, each ticked or marked “to design”; and acceptance criteria such as “Send reminder is reachable by keyboard and shows a visible focus ring”, “Amounts are right-aligned with two decimals”, “At 390 px the table becomes cards” and “After a failed send the error names the invoice and keeps the selection”.
Illustrative example: the part of the design nobody frames for the portfolio, and the part that decides whether the build matches it.

Then verify in three passes: design QA on the real build, with the designer walking every state on real devices; accessibility and performance checks on that build, not the prototype; and usability testing with target users on the critical tasks, because the team that built the interface is the least qualified group on earth to judge whether it is obvious. The proof of the pudding is in the eating.

This is also where the split between design and engineering stops being useful. If approved designs keep losing their states and accessibility on the way to production, the problem is the build, and it needs frontend development that treats those details as requirements rather than nice-to-haves.

Audit check

Take one recently shipped screen and compare it with its design, state by state, on a real phone and a real laptop.

Failure evidence

States present in design and missing in production. Focus rings, empty states or error messages “left for later”. Designers who have never seen the shipped build.

Correction pattern

Hand off state inventories and acceptance criteria, run design QA on every release, and test critical tasks with real users before calling the UI done.

Frontend development

Signed-off designs, and a build that forgets half of them?

We build interfaces that keep every state, focus ring and loading message the design promised, on the phones and laptops your customers actually use.

Keep the design intact in code

A UI design checklist you can run this week

Every “no” below is a defect with an owner, not a matter of taste.

Where your problem belongs

Best practices for UI design only help once you know which problem you have. Here is how we route the work:

The screens are fragmented and the flow underneath is unclear. Users drop out and every screen was designed separately. That is interface and flow work together, which is what our UI/UX design team does: logic and visual system fixed at once, so the result is coherent and testable.

The same UI decisions are made again and again across teams or products. Inconsistency is the symptom; the missing shared rules are the cause. A design system with components, patterns and governance is the fix.

The designs are good but the product is not. States, accessibility, responsiveness and interaction quality get lost between the file and production. That is frontend development work.

Nobody knows whether users understand the interface. Then stop debating and watch them. Usability testing on the critical tasks will tell you which screens are the problem before you pay to redesign all of them.

Pick the right one. A full redesign to fix three confusing labels is repainting the building because a sign is misspelled. A new button style on top of a broken flow is new tiles over a drain on the wrong side.

Build from a validated flow. Use a coherent component system. Design every state that has consequences, and test accessibility and behaviour in the real build, in context. Effective UI is not the prettiest screen in the portfolio. It is the one where the user always knows what matters, where their work stands, what to do next and what will happen when they do it — and where every user you paid to acquire actually gets to the point of paying you back.

UI/UX design

Your screens look finished. Your users still ask what to do next.

Bring us the flows where people get stuck. We connect the interface to the product logic, design every state that matters and hand your engineers something they can build and test.

Show us where users get stuck

Related reading

All articles