States
Complete interaction cycles for loading, empty, error, disabled, and success.
Design the whole task cycle before considering a component complete.
Loading
Keep the final layout stable. Use a skeleton that resembles the incoming content for initial page loading. Show pending state on the action that caused a mutation and prevent accidental duplicate submission.
Empty
Explain what is absent and offer the action that creates or reveals it. Keep filters available when a filtered result is empty. Do not render an empty table frame as the message.
Error
Place validation beside the field and contextual failures beside the affected content. Keep entered values. State a recovery action when one exists. Use a toast only for transient results that do not need to remain in the task context.
Disabled and unavailable
Disable an action only when the reason is obvious nearby. When a person may need to understand or request access, show the action and explain the restriction rather than removing it.
Success
Prefer the changed interface as confirmation. Add a short status or toast when the result is otherwise hard to notice. Do not leave a permanent success banner for a routine save.