import SwiftUI // Shared desktop design tokens. Keep account, installer and preparation on one visual system. enum EasyDesign { static let background=Color(red:0.065,green:0.075,blue:0.07) static let accent=Color(red:0.79,green:0.95,blue:0.37) static let ink=Color(red:0.93,green:0.94,blue:0.90) static let surface=Color.white.opacity(0.045) static let border=Color.white.opacity(0.075) static let radius:CGFloat=18 static let pagePadding:CGFloat=28 static let spacing:CGFloat=20 } struct EasyCard:View { let content:Content init(@ViewBuilder content:()->Content) {self.content=content()} var body:some View { content.padding(22).frame(maxWidth:.infinity,alignment:.leading) .background(EasyDesign.surface,in:RoundedRectangle(cornerRadius:EasyDesign.radius)) .overlay(RoundedRectangle(cornerRadius:EasyDesign.radius).strokeBorder(EasyDesign.border)) } } struct EasyPrimaryStyle:ButtonStyle { @Environment(\.isEnabled) private var enabled func makeBody(configuration:Configuration)->some View { configuration.label.font(.system(size:14,weight:.bold)).padding(.horizontal,20).padding(.vertical,12).frame(minHeight:44) .foregroundStyle(enabled ? Color.black : Color.secondary) .background(enabled ? EasyDesign.accent : Color.white.opacity(0.065),in:RoundedRectangle(cornerRadius:10)) .opacity(configuration.isPressed ? 0.8 : 1) } } struct EasySecondaryStyle:ButtonStyle { @Environment(\.isEnabled) private var enabled func makeBody(configuration:Configuration)->some View { configuration.label.font(.system(size:13,weight:.semibold)).padding(.horizontal,14).padding(.vertical,10).frame(minHeight:38) .foregroundStyle(enabled ? EasyDesign.ink : Color.secondary) .background(Color.white.opacity(configuration.isPressed ? 0.10 : 0.055),in:RoundedRectangle(cornerRadius:9)) } } struct EasyLinkStyle:ButtonStyle { @Environment(\.isEnabled) private var enabled func makeBody(configuration:Configuration)->some View { configuration.label.font(.callout).foregroundStyle(enabled ? EasyDesign.accent : Color.secondary).frame(minHeight:32).opacity(configuration.isPressed ? 0.7 : 1) } } struct EasyField:View { let title:String let content:Content init(_ title:String,@ViewBuilder content:()->Content) {self.title=title;self.content=content()} var body:some View { VStack(alignment:.leading,spacing:8) { Text(title).font(.callout.weight(.semibold)) content.textFieldStyle(.plain).padding(13).frame(minHeight:44) .background(.black.opacity(0.18),in:RoundedRectangle(cornerRadius:10)) .overlay(RoundedRectangle(cornerRadius:10).strokeBorder(EasyDesign.border)) } } } struct EasyStepRail:View { let titles:[String] let current:Int var body:some View { HStack(alignment:.top,spacing:8) { ForEach(Array(titles.enumerated()),id:\.offset) {index,title in VStack(alignment:.leading,spacing:8) { Capsule().fill(index<=current ? EasyDesign.accent : Color.white.opacity(0.09)).frame(height:4) Label(title,systemImage:index