Skip to content

Commit

Permalink
Added Primary and Secondary button styles.
Browse files Browse the repository at this point in the history
  • Loading branch information
richy486 committed Mar 26, 2024
1 parent 9df03d2 commit a5af178
Show file tree
Hide file tree
Showing 11 changed files with 242 additions and 36 deletions.
1 change: 1 addition & 0 deletions Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<key>UIAppFonts</key>
<array>
<string>Nunito-Regular.ttf</string>
<string>Nunito-SemiBold.ttf</string>
<string>NunitoSans_7pt_Condensed-Bold.ttf</string>
</array>
</dict>
Expand Down
20 changes: 16 additions & 4 deletions MoreChess.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
B9FAC92E2BB04A01002A20F7 /* PlayCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC92D2BB04A01002A20F7 /* PlayCondition.swift */; };
B9FAC9302BB05325002A20F7 /* GameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC92F2BB05325002A20F7 /* GameView.swift */; };
B9FAC9342BB053CC002A20F7 /* LobbyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC9332BB053CC002A20F7 /* LobbyView.swift */; };
B9FAC9372BB054C2002A20F7 /* SolidButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC9362BB054C2002A20F7 /* SolidButtonStyle.swift */; };
B9FAC9372BB054C2002A20F7 /* ButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC9362BB054C2002A20F7 /* ButtonStyles.swift */; };
B9FAC9392BB0586C002A20F7 /* LobbyState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC9382BB0586C002A20F7 /* LobbyState.swift */; };
B9FAC93D2BB058DB002A20F7 /* ServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC93C2BB058DB002A20F7 /* ServiceType.swift */; };
B9FAC93F2BB059CD002A20F7 /* GameService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC93E2BB059CD002A20F7 /* GameService.swift */; };
Expand All @@ -62,6 +62,10 @@
B9FAC9592BB2F92E002A20F7 /* Nunito-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B9FAC9572BB2F92E002A20F7 /* Nunito-Regular.ttf */; };
B9FAC95B2BB2FD0C002A20F7 /* Typography.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC95A2BB2FD0C002A20F7 /* Typography.swift */; };
B9FAC95C2BB2FD0C002A20F7 /* Typography.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC95A2BB2FD0C002A20F7 /* Typography.swift */; };
B9FAC9602BB30D8F002A20F7 /* StyleConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC95F2BB30D8F002A20F7 /* StyleConstants.swift */; };
B9FAC9612BB30D8F002A20F7 /* StyleConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FAC95F2BB30D8F002A20F7 /* StyleConstants.swift */; };
B9FAC9632BB30F40002A20F7 /* Nunito-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B9FAC9622BB30F40002A20F7 /* Nunito-SemiBold.ttf */; };
B9FAC9642BB30F40002A20F7 /* Nunito-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B9FAC9622BB30F40002A20F7 /* Nunito-SemiBold.ttf */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -116,7 +120,7 @@
B9FAC92D2BB04A01002A20F7 /* PlayCondition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayCondition.swift; sourceTree = "<group>"; };
B9FAC92F2BB05325002A20F7 /* GameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameView.swift; sourceTree = "<group>"; };
B9FAC9332BB053CC002A20F7 /* LobbyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LobbyView.swift; sourceTree = "<group>"; };
B9FAC9362BB054C2002A20F7 /* SolidButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SolidButtonStyle.swift; sourceTree = "<group>"; };
B9FAC9362BB054C2002A20F7 /* ButtonStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonStyles.swift; sourceTree = "<group>"; };
B9FAC9382BB0586C002A20F7 /* LobbyState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LobbyState.swift; sourceTree = "<group>"; };
B9FAC93C2BB058DB002A20F7 /* ServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceType.swift; sourceTree = "<group>"; };
B9FAC93E2BB059CD002A20F7 /* GameService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameService.swift; sourceTree = "<group>"; };
Expand All @@ -132,6 +136,8 @@
B9FAC9572BB2F92E002A20F7 /* Nunito-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Nunito-Regular.ttf"; sourceTree = "<group>"; };
B9FAC95A2BB2FD0C002A20F7 /* Typography.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typography.swift; sourceTree = "<group>"; };
B9FAC95E2BB2FE66002A20F7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B9FAC95F2BB30D8F002A20F7 /* StyleConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleConstants.swift; sourceTree = "<group>"; };
B9FAC9622BB30F40002A20F7 /* Nunito-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Nunito-SemiBold.ttf"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -325,7 +331,7 @@
B9FAC9352BB054A2002A20F7 /* Elements */ = {
isa = PBXGroup;
children = (
B9FAC9362BB054C2002A20F7 /* SolidButtonStyle.swift */,
B9FAC9362BB054C2002A20F7 /* ButtonStyles.swift */,
B9FAC9482BB06C91002A20F7 /* SimpleNavigationBackButton.swift */,
B9FAC94A2BB06FB2002A20F7 /* WaitingView.swift */,
);
Expand Down Expand Up @@ -361,6 +367,7 @@
B9FAC94E2BB2E833002A20F7 /* Color.swift */,
B9FAC95A2BB2FD0C002A20F7 /* Typography.swift */,
B9FAC9502BB2F46D002A20F7 /* Style.swift */,
B9FAC95F2BB30D8F002A20F7 /* StyleConstants.swift */,
);
path = Resources;
sourceTree = "<group>";
Expand All @@ -369,6 +376,7 @@
isa = PBXGroup;
children = (
B9FAC9572BB2F92E002A20F7 /* Nunito-Regular.ttf */,
B9FAC9622BB30F40002A20F7 /* Nunito-SemiBold.ttf */,
B9FAC9532BB2F706002A20F7 /* NunitoSans_7pt_Condensed-Bold.ttf */,
);
path = Fonts;
Expand Down Expand Up @@ -503,13 +511,15 @@
B9FAC9192BAF070C002A20F7 /* Launch Screen.storyboard in Resources */,
B9FAC9582BB2F92E002A20F7 /* Nunito-Regular.ttf in Resources */,
B95CE53B2AD4CB5E00978591 /* Assets.xcassets in Resources */,
B9FAC9632BB30F40002A20F7 /* Nunito-SemiBold.ttf in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
B95CE51A2AD4CB5E00978591 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B9FAC9642BB30F40002A20F7 /* Nunito-SemiBold.ttf in Resources */,
B9FAC9592BB2F92E002A20F7 /* Nunito-Regular.ttf in Resources */,
B95CE53C2AD4CB5E00978591 /* Assets.xcassets in Resources */,
B9FAC9552BB2F706002A20F7 /* NunitoSans_7pt_Condensed-Bold.ttf in Resources */,
Expand Down Expand Up @@ -546,10 +556,11 @@
B9FAC92E2BB04A01002A20F7 /* PlayCondition.swift in Sources */,
B9FAC9392BB0586C002A20F7 /* LobbyState.swift in Sources */,
B9FAC9112BAEF492002A20F7 /* PositioningState.swift in Sources */,
B9FAC9372BB054C2002A20F7 /* SolidButtonStyle.swift in Sources */,
B9FAC9372BB054C2002A20F7 /* ButtonStyles.swift in Sources */,
B9FAC9412BB05A63002A20F7 /* LobbyInteractor.swift in Sources */,
B94B61B32B461DD200C998F3 /* GridCoordinate.swift in Sources */,
B9FAC9242BAF1E9F002A20F7 /* Board.swift in Sources */,
B9FAC9602BB30D8F002A20F7 /* StyleConstants.swift in Sources */,
B9FAC9472BB06C0C002A20F7 /* ClientView.swift in Sources */,
B95CE5392AD4CB5E00978591 /* ContentView.swift in Sources */,
B9FAC92C2BAF3102002A20F7 /* MoveValidator.swift in Sources */,
Expand Down Expand Up @@ -586,6 +597,7 @@
B90F55AD2BA6289800874F00 /* PieceView.swift in Sources */,
B94B61B12B461D3200C998F3 /* Piece.swift in Sources */,
B90F55AA2BA61F6E00874F00 /* MovesView.swift in Sources */,
B9FAC9612BB30D8F002A20F7 /* StyleConstants.swift in Sources */,
B9FAC95C2BB2FD0C002A20F7 /* Typography.swift in Sources */,
B94B61F62B68F8D700C998F3 /* PieceGenerator.swift in Sources */,
);
Expand Down
38 changes: 38 additions & 0 deletions Shared/Assets.xcassets/Gray.colorset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.664",
"green" : "0.664",
"red" : "0.664"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.921",
"green" : "0.921",
"red" : "0.921"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
4 changes: 2 additions & 2 deletions Shared/MoreChessApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import SwiftUI
@main
struct MoreChessApp: App {

/*

init() {
for family in UIFont.familyNames {
print("\(family)")
Expand All @@ -19,7 +19,7 @@ struct MoreChessApp: App {
}
}
}
*/


var body: some Scene {
WindowGroup {
Expand Down
154 changes: 154 additions & 0 deletions Shared/Presentation/Elements/ButtonStyles.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
//
// ButtonStyles.swift
// MoreChess (iOS)
//
// Created by Richard Adem on 3/24/24.
//

import SwiftUI

struct PrimaryButtonStyle: ButtonStyle {
@Environment(\.isEnabled) private var isEnabled

func makeBody(configuration: Configuration) -> some View {

var backgroundColor: Color {
if isEnabled == false {
// Disabled
Color.disabled
} else if configuration.isPressed {
// Highlighted, just the background changes.
Color.accentColor.opacity(StyleConstants.highlightedOpacity)
} else {
// Normal
Color.accentColor
}
}

configuration.label
.padding(12)
.font(StyleFont.button)
.strikethrough(isEnabled == false, color: Color.disabled)
.foregroundStyle(Color.background)
.background{
RoundedRectangle(cornerRadius: StyleConstants.cornerRadius)
.fill(backgroundColor)
.animation(.easeOut(duration: StyleConstants.animationTime),
value: configuration.isPressed)
}
}
}

struct SecondaryButtonStyle: ButtonStyle {
@Environment(\.isEnabled) private var isEnabled

func makeBody(configuration: Configuration) -> some View {

var backgroundColor: Color {
if isEnabled == false {
// Disabled
Color.disabled
} else if configuration.isPressed {
// Highlighted
Color.accentColor
} else {
// Normal
Color.accentColor
}
}

configuration.label
.padding(10)
.font(StyleFont.button)
.strikethrough(isEnabled == false, color: Color.disabled)
.foregroundStyle(Color.accentColor)
.background{
RoundedRectangle(cornerRadius: StyleConstants.cornerRadius)
.stroke(backgroundColor, lineWidth: StyleConstants.lineWidth)
.animation(.easeOut(duration: StyleConstants.animationTime),
value: configuration.isPressed)
}
// Change whole button on pressed.
.opacity(configuration.isPressed ? StyleConstants.highlightedOpacity : 1.0)
}
}

struct SolidButtonStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
.padding()
.background(Color.accentColor)
.foregroundStyle(Color.background)
.font(.headline)
.clipShape(Capsule())
.scaleEffect(configuration.isPressed ? 1.2 : 1)
.animation(.easeOut(duration: StyleConstants.animationTime), value: configuration.isPressed)
}
}

struct FunkyButtonStyle: ButtonStyle {

@Environment(\.colorScheme) var colorScheme

fileprivate struct CurvedLine: Shape {
func path(in rect: CGRect) -> Path {
Path { path in
path.move(to: CGPoint(x: rect.minX, y: rect.minY))
path.addQuadCurve(to: CGPoint(x: rect.maxX, y: rect.midY),
control: CGPoint(x: rect.width * 1.0, y: rect.height * -0.4))

}
}
}

func makeBody(configuration: Configuration) -> some View {
let foregroundColor = colorScheme == .dark ? Color.foreground : Color.background

configuration.label
.padding()
.background(LinearGradient(gradient: Gradient(colors: [.accentColor, .black]),
startPoint: .top,
endPoint: .bottom))
.overlay{
VStack {
CurvedLine()
.stroke(.white, style: StrokeStyle(lineWidth: 4, lineCap: .round))
.frame(height: 10)
.padding(.vertical, 6)
.padding(.leading, 19)
.padding(.trailing, 14)
Spacer()
}
}
.foregroundStyle(foregroundColor)
.font(.headline)
.clipShape(Capsule())
.scaleEffect(configuration.isPressed ? 1.2 : 1)
.rotationEffect(.degrees(configuration.isPressed ? 30 : 0))
.animation(.easeOut(duration: StyleConstants.animationTime), value: configuration.isPressed)
}
}

#Preview {
VStack {

Button("Button") { }.buttonStyle(PrimaryButtonStyle())
Button("Disabled") { }.buttonStyle(PrimaryButtonStyle())
.disabled(true)

Button("Button") { }.buttonStyle(SecondaryButtonStyle())
Button("Disabled") { }.buttonStyle(SecondaryButtonStyle())
.disabled(true)


Button("Press Me") { }
.buttonStyle(SolidButtonStyle())

Button("Press Me") { }
.buttonStyle(FunkyButtonStyle())

Button("Very long text for a button") { }
.buttonStyle(FunkyButtonStyle())
}
.style()
}
28 changes: 0 additions & 28 deletions Shared/Presentation/Elements/SolidButtonStyle.swift

This file was deleted.

4 changes: 2 additions & 2 deletions Shared/Presentation/Lobby/LobbyView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,12 @@ struct LobbyView: View {
Button("Host") {
lobbyInteractor.select(serviceType: .host)
}
.buttonStyle(SolidButtonStyle())
.buttonStyle(PrimaryButtonStyle())

Button("Join") {
lobbyInteractor.select(serviceType: .client)
}
.buttonStyle(SolidButtonStyle())
.buttonStyle(PrimaryButtonStyle())
} // HStack
}
.style()
Expand Down
6 changes: 6 additions & 0 deletions Shared/Resources/Color.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
import SwiftUI

extension Color {

// Functional Colors
static let foreground = Color("Foreground")
static let background = Color("Background")
static let disabled = Color.brandedGray

// Defined Colors
static let brandedGray = Color("Gray")
}
Binary file added Shared/Resources/Fonts/Nunito-SemiBold.ttf
Binary file not shown.
18 changes: 18 additions & 0 deletions Shared/Resources/StyleConstants.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// StyleConstants.swift
// MoreChess
//
// Created by Richard Adem on 3/26/24.
//

import Foundation

enum StyleConstants {
// Layout
static let lineWidth: CGFloat = 2
static let highlightedOpacity: CGFloat = 0.25
static let cornerRadius: CGFloat = 8

// Animation
static let animationTime: TimeInterval = 0.2
}
Loading

0 comments on commit a5af178

Please sign in to comment.