Responsiveness

How the interface should react to what people do — optimistic updates, loading states, feedback, and undo — so the Fortiv experience feels instant and trustworthy.

Principles

Responsiveness is about how the system reacts, not how things move (that is Animation). The system responds to people instantly and reconciles with the server quietly in the background.

The user never waits to see their own change

When someone renames a process or checks off a recovery step, the result appears immediately — before the server confirms. The network is slow and unpredictable; the user's intent is not.

The server confirms; it does not gate

The happy path is overwhelmingly common: the save succeeds. Design for that. Don't make every successful user pay the latency tax of waiting for permission that almost always comes.

The change is the feedback

When an action visibly does what the user expected, that is the confirmation. Don't stack a success toast on a change the user can already see — it trains people to ignore notifications.

Confidence over confirmation

Prefer designs that let people move fast and recover, over designs that interrupt to ask “are you sure?”. Reserve confirmation for the genuinely irreversible; everywhere else, prefer undo.

The responsiveness spectrum

Reversibility and risk decide how much the system trusts the user up front. Default to the top of the table — most BCMS interactions are edits to data the user owns and can change again.

Action typeExamplesStrategyFeels like
Cheap & reversibleRename, toggle, check off a step, reorder, reassignOptimistic — apply instantly, reconcile in backgroundInstant
Creating somethingAdd a process, add a row, post a commentOptimistic insert — show immediately in a pending styleInstant, with a brief settle
Consequential but recoverableArchive a plan, remove a dependency, bulk status changeOptimistic + undo — apply instantly, offer undoInstant, with a safety net
Slow or heavyGenerate a report, run a simulation, import a filePending state — acknowledge, show progress, stay unblockedAcknowledged, not blocking
Destructive & irreversiblePermanently delete, submit a BIA, finalize a reviewConfirm first — a deliberate moment of frictionConsidered

Loading states: nothing > skeleton > spinner

The order of preference when the data isn't here yet. Never show a spinner on an action the user initiated themselves — that action should be optimistic.

SituationTreatment
User edited their own dataNo loading state — optimistic update
First load of a list, table, or detailSkeleton matching the content shape
Navigating to a previously-seen viewKeep prior content, swap when ready
Slow async job (report, simulation)Inline progress + keep the user unblocked
Unknown-shape, unavoidable waitSmall contained spinner — never full-screen

Feedback patterns

Match the feedback to where the user's attention is and whether the result is in or out of context.

ResultPattern
Successful in-context changeSilent — the visible change is the feedback
Success the user can't see (background job, async save elsewhere)Toast
Field / form validation errorInline, next to the field
Failed optimistic mutationQuiet revert + toast explaining what happened
Destructive action completedToast with Undo

In-flight affordances

While an action is settling, communicate intent without breaking the layout.

Show intent without layout shift

A button that triggered an action can show it's working, but must not change size or jump. Swap a label for a same-footprint spinner, or dim-and-disable in place.

Optimistic inserts and removes

Show a new item immediately in a subtly pending style, then settle on confirmation. Animate a removed item out on the user's action; if the server rejects, animate it back in and toast.

Disable, don't disappear

If an action is temporarily unavailable while something settles, disable the control in place. A control that vanishes and reappears is more disorienting than one that briefly dims.

Review checklist

Common responsiveness issues and their fixes. Use this when reviewing interaction code.

BeforeAfterWhy
Spinner on user's own save / editOptimistic update, no spinnerThe user should never wait to see their own change
Blank screen while next view loadsKeep prior content, swap when readyA view that never goes blank feels instant
Full-screen spinner on first loadSkeleton matching content shapeSkeletons set expectations and prevent layout shift
Success toast on a visible changeSilent — the change is the feedbackRedundant toasts train people to ignore them
Confirm modal on archive / removeAct immediately + Undo toastUndo beats confirm for recoverable actions
No handling for failed mutationQuiet revert + explanatory toastOptimistic UI must handle the rare failure deliberately
Form error in a top-level bannerInline next to the fieldPut the error where the fix happens
Button resizes / jumps while loadingDim-and-disable in place, reserve spaceIn-flight states must not shift layout
Item appears only after server confirmsOptimistic insert in pending styleShow creation instantly, settle on confirm
Control disappears while unavailableDisable in placeVanishing controls are more disorienting than dimmed ones

Use this as a Claude skill

This page is also a Claude Code skill. The same guidance you read here is what the agent applies when it writes or reviews code — so the product stays consistent with what is documented.

fortiv-responsiveness
How the system should react to user actions

For everyone

Read this page before writing a marketing piece, a product screen, or any user-facing copy. It is the single source of truth for how Fortiv should look, feel, and sound.

For Claude Code

The skill lives at design/.claude/skills/responsiveness.md and loads automatically when relevant. To invoke it explicitly, ask in plain language — for example:

Make this save optimistic — follow the responsiveness skill
Review this mutation flow against our responsiveness guidelines
What loading state should this table use?