Docs
Lists

Status Timeline

A vertical status timeline on glass nodes: the live one breathes, done ones stamp to a check, and details bud out of a node.

$npx swiftpieces add StatusTimeline
See it in a Pro app On a real screen in one of the Pro apps: open it with Pro, take it apart, remix it, and copy the SwiftUI.
Free · MIT + Commons ClauseiOS 17.0+Liquid Glasstimelinestatustrackingprogressstepsglass
Type
StatusTimeline
Files
StatusTimeline.swift
Depends on
Nothing (Apple frameworks only)
Version
2.2.0

Vertical timeline for order tracking, delivery, or verification flows. Each step's node is a liquid glass bubble, tinted by its status. An open step's detail sits on a glass panel that buds out of its node and rests joined to it by a liquid neck, so the node and its detail read as one shape.

Notes

  • Every node is a liquid glass bubble, tinted by its status: the live step signal (style.current) with a breathing ring, completed steps sage with a drawn check, a failed step butter with an x, and pending steps clear glass with a quiet number. On iOS 26 this is Liquid Glass; before that frosted Material, and under Reduce Transparency solid fills.
  • An open step's detail sits on a glass panel that buds out of its node: born inside the node as a small round blob, it grows out into the panel behind the step's text and rests joined to the node by a liquid neck, so the node and its detail read as one shape. The live step's panel takes the signal tint with dark ink, a failed step's the butter tint, any other step's stays clear glass. Closing, the detail blurs away, the panel's tint drains and it melts back into the node.
  • Layout is nodes leading, content trailing: a 44pt column holds the 30pt node and the connector below it, which stretches to the row's own height, so long titles and expanded detail never break the line. Rows hug their content, so the timeline never stretches to fill a tall container. Each row's glass is its own liquid group, so a node holds its own panel and never melts into its neighbour.
  • A status change plays as a relay down the trail. The step that completes stamps first: its number blurs out, its node takes the sage tint, the check draws a beat later, and as it lands the node pops with the .success haptic. Its open panel drains and melts back into the node. The ink then runs down its connector in the text color, on a fixed 0.4s clock, and the next step takes its new status only as the ink reaches it: its node lights signal, and with expandsCurrent its panel buds out a beat after that.
  • A .failed step lands the same way: its node turns butter with an x, gives a small shake with the .error haptic on the same beat, and the connector below it turns dashed, so the trail visibly stops. A reset or any change that doesn't complete a step lands in one beat, with checks and ink clearing quickly.
  • A change that completes three or more steps at once is catching up rather than handing off, so it lands in one beat. Steps are tracked by title: a step that moves still relays its change, a renamed one shows its status at once, and a repeated title keeps its own state. A newer change mid-relay carries on from what is on screen, and a stamp it cuts short still plays its haptic once. Each change plays each haptic once. A timeline that appears shows its current state without replaying anything, its open panel already out, and one that changed while off screen catches up as it returns, its tints, checks and ink settling together with no relay and no haptics. VoiceOver reads every step's real status at once, never the relay's delayed drawing of it.
  • Tap any step with detail to expand it; one step is expanded at a time. The row grows around the detail on a calm spring while the panel buds out and the text blurs in, clipped to the panel so it never shows past its edge; closing is quicker. expandsCurrent opens the current step on appearance and follows it as the live step moves on, including a move made while the timeline was off screen, which it shows as it stands on return.
  • Style (StatusTimeline.Style): current, complete, failed, ink, text, muted. surface is kept so existing code compiles but no longer draws anything: open detail sits on glass. tint: still overrides both the current and complete colors.
  • Under Reduce Motion every change lands in one short beat with no relay: tints, checks, ink and detail crossfade without drawing, popping or shaking, panels fade in place instead of budding, and the rows reflow once. The breathing ring becomes a still halo that breathes in opacity, so the live step still reads as in progress. The colors, the marks and both haptics still carry each change. Each step is a single VoiceOver element that reads its title, timestamp and status, and is a button only when it has detail.

Usage

StatusTimelineExample().preferredColorScheme(.light)

Parameters

ParameterDescription
stepsSteps in order, each with a title, optional detail and timestamp, and a status.
tintGlass tint for the current step and completed nodes. nil uses style.current and style.complete.
expandsCurrentStart with the current step expanded.
styleTints, text colors and connector. Defaults to the house palette.

Install

Pick one. Run it from the folder that contains your .xcodeproj and the files land inside your app.

Terminal

$npx swiftpieces add StatusTimeline

Or ask your coding agent · Claude Code, Cursor or Xcode, once the MCP server is connected

>Add the SwiftPieces "Status Timeline" piece to my app

Or copy the source above into your app.

New to SwiftUI?If you know React, CSS or Tailwind, SwiftUI is easier to pick up than it looks.Try real app patterns first

Building a whole app? See SwiftPieces Pro →

All lists →

Build it yourself: SwiftUI loading states guide · SwiftUI cards guide

On this page

SwiftPiecesPro

Build the whole app with one library.

Production-ready screens, whole flows, complete app templates, a Build Kit your agent follows and Pro remixing.

54 screens · 46 patterns · 48 flows · 12 templates · 31 Build Kit skills

Explore Pro