Data Display
Loader
The Loader component provides feedback during async actions, such as loading data, submitting forms, or transitioning between views. It uses motion to reassure users that the system is working and will respond shortly. Loaders are visual only and do not convey progress or timing. For measurable progress, use a Progress Bar or Progress Circle.
🧭 When to Use a Loader
Use a Loader when:
A system action is in progress but doesn’t require exact progress feedback
The wait time is short and doesn’t justify a full step indicator
You need a compact visual to fill space while data or content loads
Avoid Loaders when:
Progress is measurable — use a Progress Bar or Progress Circle instead
You’re blocking the entire screen — use a Loader with an Overlay or a Skeleton screen
🎨 Types
Circle – A full, smooth looping ring (default and most commonly used)
Quarter Circle – A minimal motion arc; less visually heavy, good for embedded UI
Spinner – A traditional two-tone rotating bar; high visibility and expressive
Each type is animated and uses motion tokens for timing and easing.
📏 Sizes
Small (sm) – Used in compact UI elements like buttons or tables
Medium (md) – Default size; suitable for cards, modals, and panels
Large (lg) – Used for main content areas or large blocks during loading
Extra Large (xl) – For full-screen or empty state loaders (e.g., dashboards, overlays)
Size affects stroke width, container size, and spacing.
🎯 States
Default – Uses neutral or branded colors depending on context and theme
Inverse – Optimized for dark backgrounds or overlays (e.g., white loader on black background)
You can toggle these via Figma variants to quickly preview loaders in different layout environments.
♿ Accessibility Considerations
From a design perspective:
Always pair the loader with supporting text or a label if the action is longer than 2 seconds
Ensure motion is smooth and does not flash or distract users
Use inverse states where backgrounds are dark or low contrast
From a code perspective (if implemented):
Use
role="status"
and include a visually hidden label like “Loading...”Avoid using only visual indicators—assistive technologies should be able to announce activity
Do not use
aria-busy="true"
on entire pages unless absolutely necessary
✅ Best Practices
Use loaders only when the wait is perceptible — if content loads instantly, skip them
For button-level actions, use the small size inside the button (replace text or align left of label)
Pair with contextual messaging like “Loading orders…” or “Submitting form…” when possible
Avoid using multiple loaders on a single screen — it dilutes clarity
Choose circle or quarter circle for minimal UI impact, spinner when attention is critical
Welcome Aboard
© Copyright 2024. All rights reserved.