Status Bar
Overview
A slim, animated bar that slides in at the bottom of a view to indicate a background operation is in progress. Shows an indeterminate spinner and a status text message. Appears during sync, loading, or processing operations and disappears when complete.
Behavioral Requirements
- slide-in-animation: The bar MUST slide in from the bottom edge with an animated transition when an operation begins.
- slide-out-animation: The bar MUST slide out with an animated transition when the operation completes.
- indeterminate-spinner: The bar MUST display an indeterminate progress spinner (platform-native).
- status-text-display: The bar MUST display a status text message describing the current operation.
- overlay-not-push: The bar MUST be overlaid on existing content (not push content up).
- ease-in-out-timing: The animation MUST use an ease-in-out curve with ~0.3s duration.
- update-text-while-visible: The bar SHOULD support updating the status text while visible (e.g., "Scanning..." -> "Scanning 42 files...").
- non-blocking-interaction: The bar MUST NOT block interaction with the content beneath it.
Appearance
- Height: 28–32pt
- Background: System material / translucent with subtle blur (or opaque secondary background)
- Spinner: Platform-native indeterminate
ProgressView/CircularProgressIndicator/ CSS spinner, 16pt - Text: Caption, secondary color
- Spacing: 8pt between spinner and text
- Padding: 8pt horizontal, 4pt vertical
- Corner radius: 0 (full-width bar) or 8pt if floating
- Position: Bottom edge of container, full width
States
| State | Appearance |
|---|---|
| Hidden | Not rendered, no space consumed |
| Appearing | Slides in from bottom with opacity fade |
| Visible | Spinner animating, text displayed |
| Text updating | Text cross-fades to new value |
| Disappearing | Slides out to bottom with opacity fade |
Accessibility
- announce-appearance: The bar MUST announce its appearance to screen readers with the status text.
- polite-live-region: Status text updates SHOULD be announced as polite live region updates (not interrupting).
Conformance Test Vectors
| ID | Requirements | Input | Expected |
|---|---|---|---|
| status-001 | slide-in-animation | Set isSyncing = true | Bar slides in from bottom |
| status-002 | slide-out-animation | Set isSyncing = false | Bar slides out to bottom |
| status-003 | overlay-not-push | Bar visible over scrollable content | Content beneath is still scrollable |
| status-004 | update-text-while-visible | Change text while visible | Text updates without bar re-animating |
| status-005 | non-blocking-interaction | Tap content behind visible bar | Content responds to tap |
Edge Cases
- Rapid show/hide: If the operation completes before the appear animation finishes, the bar SHOULD reverse smoothly (not jump).
- Very long status text: Truncate with ellipsis on one line.
- Multiple overlapping operations: Show the most recent status text. Bar stays visible until all operations complete.
Configuration
This ingredient has no configurable options.
Logging
Subsystem: {{bundle_id}} | Category: StatusBar
| Event | Level | Message |
|---|---|---|
| Shown | debug | StatusBar: shown with "{{text}}" |
| Text updated | debug | StatusBar: updated to "{{text}}" |
| Hidden | debug | StatusBar: hidden |
Platform Notes
- SwiftUI: Use
.overlay(alignment: .bottom)with aGroupthat conditionally renders the bar. Transition:.move(edge: .bottom).combined(with: .opacity). Animation:.easeInOut(duration: 0.3). UseProgressView()for spinner. - Compose:
Box(modifier = Modifier.fillMaxSize())withAnimatedVisibility(enter = slideInVertically + fadeIn, exit = slideOutVertically + fadeOut)at bottom.CircularProgressIndicator(modifier = Modifier.size(16.dp)). - React/Web: Absolutely positioned
<div>atbottom: 0with CSS transition ontransform: translateY()andopacity. Use CSS@keyframes spinfor spinner or a library spinner.
Design Decisions
None yet.