No.366 · Feedback· New
Indeterminate Progress
For work of unknown length: a bar that slides and stretches across the track, or a track of moving stripes. There is no value, only 'still going'.
The prompt
Written for the variant you picked above: Light
Build an indeterminate progress indicator (no value) with a label. Inter 500 at 14px. Above the bar: the label on the left and an optional hint on the right in muted type ('Usually under a minute'). Bars come in three sizes (4, 8 and 12px tall) with fully rounded tracks. The default: a bar 40% of the track slides from beyond the left edge to beyond the right every 1.5s (ease in-out), stretching to 1.2× mid-way. The alternative: the whole track carries -45° stripes (6px) that drift right. Semantics: role=progressbar labelled by the label, with aria-busy and no value attributes, since there's no value to report. Palette (light / dark): ink and fill #18181b / #ececef, muted #6b6b73 / #a1a1aa, track #ececef / #232327.. Show three examples on a white / #0b0b0c page. Examples: 'Connecting to the database' with a hint, 'Indexing files' (striped, large), 'Syncing' (small). Selected variant — Light (light): Palette for this theme (Light): --ipbr-done #15803d; --ipbr-fill #18181b; --ipbr-ink #18181b; --ipbr-soft #6b6b73; --ipbr-track #ececef. Treat these as the root colour tokens, one value per role, and name them to suit your code. Select it with the theme option set to "light". Keep every dimension, spacing value, state and motion from the brief unchanged, and keep text at 4.5:1 contrast or better on these surfaces. This selection takes precedence over references to other themes or options in the general brief. Implement this selected appearance; do not add a variant picker or alternative appearances unless requested. Implementation requirements: Use React and TypeScript. Keep the component self-contained, with uniquely scoped CSS and no animation libraries. Include required imports, styles and font setup in the result. Interaction: None; it reports that work is happening. Motion: A 1.5s slide-and-stretch loop, or 0.6s stripes. Reduced motion slows the slide and stops the stripes. Accessibility: role=progressbar with a label and aria-busy; no value is announced because none exists. Responsive behavior: Bars fill their container. Touch: Nothing to tap. Preserve keyboard access, visible focus and reduced-motion behavior. Keep fictional demo data and simulated service calls in a separate usage example; expose callbacks for real actions and recover from rejected requests. Keep usage-example links inside the demo: use local buttons or prevent navigation. Demonstration links must not navigate to Vitrine routes or open other pages; preserve real URL support in the reusable component itself. Verify the result at narrow and wide viewport sizes, with keyboard input and reduced motion enabled.
Notes
- Interaction
- None; it reports that work is happening.
- Motion
- A 1.5s slide-and-stretch loop, or 0.6s stripes. Reduced motion slows the slide and stops the stripes.
- Accessibility
- role=progressbar with a label and aria-busy; no value is announced because none exists.
- Responsive
- Bars fill their container.
- On touch
- Nothing to tap.