SwiftUI · Part 2 of 2

The dawn of new aesthetics - Part 2

SwiftUI engineering breakdown of the glass arrow date selector — metrics, steel strokes, reflection, and motion — with open-source code in swiftuibuttons.

28 May 2026

Before you step

Fork swiftuibuttons and create ArrowButton.swift. Paste the constants and colours first — the same tokens you locked in Part 1 before touching strokes or blur.

Each section below adds the next layer. The step titles match ArrowButtonStep.title in the repo and the labels in the video above.

SwiftLine 1, Col 1

Base Circle

Add CircularSteelStrokeOverlay, ArrowButtonStep, and ArrowButton. At .base, visibleStrokeCount is 0 — the overlay draws nothing yet. You only see Circle().fill(Color.buttonFill).

showsReflection and showsArrow are still false, so reflectionLayer and the arrow Image stay hidden.

SwiftLine 1, Col 1
SwiftLine 1, Col 1
SwiftLine 1, Col 1
Figma build progression — core fill layer on the glass button.

Dark Edge I

Step to .strokeDarkLeading. visibleStrokeCount becomes 1 — the first if visibleStrokeCount >= 1 branch in CircularSteelStrokeOverlay draws the leading dark gradient with .blendMode(.darken).

SwiftLine 1, Col 1
First metallic stroke on the button edge.

Dark Edge II

At .strokeDarkTrailing, visibleStrokeCount is 2. The second darken stroke runs from trailing toward topLeading — the mirror of Dark Edge I.

SwiftLine 1, Col 1
Second dark stroke on the button edge.

Light Edge I

At .strokeHighlightBottom, visibleStrokeCount is 3. The third stroke adds a white gradient along the bottom with .blendMode(.overlay).

SwiftLine 1, Col 1
First highlight stroke on the button edge.

Light Edge II

At .strokeHighlightTop, visibleStrokeCount reaches 4 and stays there for every later step. The fourth stroke adds the top highlight with .blendMode(.normal).

SwiftLine 1, Col 1
Fourth stroke completing the metallic ring.

Reflection

At .reflection, showsReflection turns on and reflectionBlurRadius is still 0. reflectionLayer draws the vertical grey gradient circle, offset down by reflectionYOffset.

SwiftLine 1, Col 1
Reflection layer behind the button face.

Frosted Blur

At .reflectionBlur, reflectionBlurRadius switches to ArrowButtonMetrics.reflectionBlur. The same reflectionLayer softens into frost — the same beat as Part 1’s blur step.

SwiftLine 1, Col 1
Frosted blur on the reflection layer.

Arrow Icon

At .arrow, showsArrow is true. The body adds Image("arrow") with rotationEffect and a light drop shadow. Pass rotation for previous vs next in the date selector.

SwiftLine 1, Col 1
Arrow vector on the glass button.

Complete

At .complete, every layer is on — four strokes, frosted reflection, and the arrow. ArrowButtonTutorial drives the same step enum with chevron prev/next, matching the video above.

When the tutorial reaches .complete, the button becomes tappable and opens ArrowDateSelector via onOpenDateSelector in ContentView.swift.

SwiftLine 1, Col 1
Completed glass arrow button.