feat: draw the iOS sign-in, onboarding, workspace picker and server-unreachable surfaces on the sky photo (showcase card, feature pill, gear and back buttons, step badge, retry and workspace actions) with native Liquid Glass instead of flat frosted tiles

This commit is contained in:
Matthew Meszaros
2026-10-11 19:43:46 +02:00
parent ec46f57d22
commit 30621400a7
5 changed files with 12 additions and 41 deletions
-7
View File
@@ -57,13 +57,6 @@ enum WTheme {
: UIColor.white.withAlphaComponent(min(0.8, 0.35 + opacity * 2.5)) })
}
/// A tile's edge on the sky: white on the night, a faint ink line on the photo.
static func skyEdge(_ opacity: Double) -> Color {
Color(UIColor { $0.userInterfaceStyle == .dark
? UIColor.white.withAlphaComponent(opacity)
: UIColor(red: 0.07, green: 0.09, blue: 0.15, alpha: 0.08) })
}
// Accent (sky)
static let accent = Color.dynamic(light: 0x0A8DE6, dark: 0x3DB8FF)
static let accentDeep = Color.dynamic(light: 0x0670C2, dark: 0x0EA5E9)
+2 -18
View File
@@ -926,22 +926,7 @@ struct FeatureShowcase: View {
}
.padding(22)
.frame(maxWidth: .infinity, alignment: .leading)
.background {
RoundedRectangle(cornerRadius: 24, style: .continuous)
.fill(WTheme.skyTile(0.045))
.background(.ultraThinMaterial.opacity(0.25), in: RoundedRectangle(cornerRadius: 24, style: .continuous))
.overlay(
RoundedRectangle(cornerRadius: 24, style: .continuous)
.strokeBorder(
LinearGradient(
colors: [.white.opacity(0.22), .white.opacity(0.05)],
startPoint: .top,
endPoint: .bottom
),
lineWidth: 1
)
)
}
.glassEffect(.regular, in: RoundedRectangle(cornerRadius: 24, style: .continuous))
}
@ViewBuilder
@@ -979,8 +964,7 @@ struct FeatureTicker: View {
.foregroundStyle(WTheme.onSky)
.padding(.horizontal, 15)
.frame(height: 36)
.background(WTheme.skyTile(0.14), in: Capsule())
.overlay(Capsule().strokeBorder(WTheme.skyEdge(0.25), lineWidth: 1))
.glassEffect(.regular, in: Capsule())
.id(index)
.transition(.blurReplace)
}
+3 -6
View File
@@ -64,8 +64,7 @@ struct FlowSkyButton: View {
.font(.system(size: 15, weight: .semibold))
.foregroundStyle(WTheme.onSky)
.frame(width: 40, height: 40)
.background(WTheme.skyTile(0.12), in: Circle())
.overlay(Circle().strokeBorder(WTheme.skyEdge(0.16), lineWidth: 1))
.glassEffect(.regular.interactive(), in: Circle())
}
.buttonStyle(PressableButtonStyle())
.accessibilityLabel(label)
@@ -83,8 +82,7 @@ struct FlowSkyPill: View {
.foregroundStyle(WTheme.onSky)
.padding(.horizontal, 15)
.frame(height: 36)
.background(WTheme.skyTile(0.12), in: Capsule())
.overlay(Capsule().strokeBorder(WTheme.skyEdge(0.16), lineWidth: 1))
.glassEffect(.regular.interactive(), in: Capsule())
.buttonStyle(PressableButtonStyle())
}
}
@@ -152,8 +150,7 @@ struct FlowSkyStage: View {
.foregroundStyle(WTheme.onSky)
.contentTransition(.symbolEffect(.replace))
.frame(width: 56, height: 56)
.background(WTheme.skyTile(0.16), in: Circle())
.overlay(Circle().strokeBorder(WTheme.skyEdge(0.3), lineWidth: 1))
.glassEffect(.regular, in: Circle())
Text(title)
.font(.system(size: 16, weight: .semibold))
.foregroundStyle(WTheme.onSky)
@@ -61,7 +61,7 @@ struct OrgPickerView: View {
.foregroundStyle(WTheme.onSky.opacity(0.9))
.padding(.horizontal, 14)
.frame(height: 34)
.background(WTheme.skyTile(0.16), in: Capsule())
.glassEffect(.regular.interactive(), in: Capsule())
.buttonStyle(PressableButtonStyle())
}
.padding(.horizontal, 16)
@@ -73,14 +73,11 @@ struct OrgPickerView: View {
HeroFlightScene()
VStack(spacing: 12) {
ZStack {
Circle().fill(WTheme.skyTile(0.16))
Circle().strokeBorder(WTheme.skyEdge(0.3), lineWidth: 1)
Image(systemName: "person.2.fill")
.font(.system(size: 20, weight: .semibold))
.foregroundStyle(WTheme.onSky)
}
.frame(width: 54, height: 54)
Image(systemName: "person.2.fill")
.font(.system(size: 20, weight: .semibold))
.foregroundStyle(WTheme.onSky)
.frame(width: 54, height: 54)
.glassEffect(.regular, in: Circle())
Text("Choose a workspace")
.font(.system(size: 15.5, weight: .bold))
+1 -1
View File
@@ -82,7 +82,7 @@ struct UnreachableView: View {
.foregroundStyle(WTheme.onSky)
.padding(.horizontal, 18)
.padding(.vertical, 9)
.background(WTheme.skyTile(0.18), in: Capsule())
.glassEffect(.regular.interactive(), in: Capsule())
}
.buttonStyle(TapScaleStyle())
}