FlutterWidgets
VisorLoadingDots
Three-dot animated loading indicator with staggered wave pulse and reduce-motion support.
VisorLoadingDots is a soft, brand-friendly alternative to a spinner. Three
dots pulse in a staggered wave using semantic accent colors. When the system
requests reduced motion, the animation halts and all dots snap to the lightest
color — preserving the visual but removing the movement.
Preview
When to Use
- Soft, brand-friendly loading state as an alternative to a spinner
- Inline loading inside chat bubbles, text areas, or compact UI slots
- Processing states where a gentle animation conveys progress without urgency
- Any context where animation must respect the system reduce-motion preference
When Not to Use
- Full-page loading states where a skeleton screen better preserves layout
- Determinate progress (use
LinearProgressIndicatorwith a value) - Contexts where a spinner (
VisorLoadingIndicator) is more conventional - Replacing button content during loading (use
VisorButton'sisLoading)
Installation
npx visor add loading-dots --target flutterOr copy components/flutter/visor_loading_dots/visor_loading_dots.dart
into your project.
Basic Usage
import 'package:ui/ui.dart';
const VisorLoadingDots()Customising Size and Colors
VisorLoadingDots(
dotSize: 8,
colorStart: context.visorColors.surfaceAccentSubtle,
colorMid: context.visorColors.surfaceAccentDefault,
colorEnd: context.visorColors.surfaceAccentStrong,
)With Accessibility Label
VisorLoadingDots(semanticLabel: 'Loading messages')API Reference
| Property | Type | Default | Description |
|---|---|---|---|
dotSize | double? | 10.0 | Diameter of each dot in logical pixels |
colorStart | Color? | surfaceAccentSubtle | Lightest animation color |
colorMid | Color? | surfaceAccentDefault | Middle animation color |
colorEnd | Color? | surfaceAccentStrong | Darkest animation color |
semanticLabel | String? | null | When provided, wraps the widget in Semantics(label: …) |
Accessibility
- Reduce-motion aware — when
MediaQuery.disableAnimationsis true, all dots snap tocolorStartand the animation controller pauses. semanticLabelis opt-in. When omitted, the widget is purely decorative to screen readers; useliveRegionhigher in the tree to announce state transitions when the indicator is the only feedback signal.
Source
components/flutter/visor_loading_dots/visor_loading_dots.dart- Quality contract audit row:
docs/flutter-widget-quality-contract.md(Rec8)