Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
This commit is contained in:
parent
edd9218738
commit
64199d5bb3
@ -29,72 +29,26 @@ enum Design {
|
|||||||
typealias BaseFontSize = CasinoDesign.BaseFontSize
|
typealias BaseFontSize = CasinoDesign.BaseFontSize
|
||||||
typealias IconSize = CasinoDesign.IconSize
|
typealias IconSize = CasinoDesign.IconSize
|
||||||
|
|
||||||
// MARK: - Baccarat-Specific Component Sizes
|
// MARK: - Baccarat-Specific Sizes (use CasinoDesign.Size for shared values)
|
||||||
|
|
||||||
enum Size {
|
enum Size {
|
||||||
// MARK: - Hand Scaling
|
// Card display on table
|
||||||
|
static let cardWidthTable: CGFloat = 70 // iPhone
|
||||||
|
static let cardWidthTableiPad: CGFloat = 90 // iPad
|
||||||
|
static let cardOverlap: CGFloat = -35 // iPhone (negative = more overlap)
|
||||||
|
static let cardOverlapiPad: CGFloat = -45 // iPad
|
||||||
|
|
||||||
// Use shared scaling from CasinoKit
|
// Table layout
|
||||||
static var handScale: CGFloat { CasinoDesign.Size.handScale }
|
|
||||||
static var fontScale: CGFloat { CasinoDesign.Size.fontScale }
|
|
||||||
|
|
||||||
/// Additional scale multiplier for large screens (iPad).
|
|
||||||
static let largeScreenMultiplier: CGFloat = 1.2
|
|
||||||
|
|
||||||
// Cards - base values from CasinoDesign
|
|
||||||
static let cardWidthSmall: CGFloat = CasinoDesign.Size.cardWidthSmall
|
|
||||||
static let cardWidthMedium: CGFloat = CasinoDesign.Size.cardWidthMedium
|
|
||||||
static let cardWidthLarge: CGFloat = CasinoDesign.Size.cardWidthLarge
|
|
||||||
static let cardAspectRatio: CGFloat = CasinoDesign.Size.cardAspectRatio
|
|
||||||
|
|
||||||
/// Base card width before scaling
|
|
||||||
static let cardWidthTableBase: CGFloat = 45
|
|
||||||
|
|
||||||
/// Base card overlap before scaling.
|
|
||||||
/// More negative = more overlap (less card visible).
|
|
||||||
private static let cardOverlapBase: CGFloat = -25
|
|
||||||
|
|
||||||
/// Card width scaled for the current device.
|
|
||||||
static var cardWidthTable: CGFloat {
|
|
||||||
cardWidthTableBase * handScale
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Card width scaled for iPad (with large screen multiplier).
|
|
||||||
static var cardWidthTableLarge: CGFloat {
|
|
||||||
cardWidthTableBase * handScale * largeScreenMultiplier
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Card overlap scaled for the current device.
|
|
||||||
static var cardOverlap: CGFloat {
|
|
||||||
cardOverlapBase * handScale
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Card overlap scaled for iPad (with large screen multiplier).
|
|
||||||
static var cardOverlapLarge: CGFloat {
|
|
||||||
cardOverlapBase * handScale * largeScreenMultiplier
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chips - use CasinoDesign values
|
|
||||||
static let chipSmall: CGFloat = CasinoDesign.Size.chipSmall
|
|
||||||
static let chipMedium: CGFloat = CasinoDesign.Size.chipMedium
|
|
||||||
static let chipSelector: CGFloat = CasinoDesign.Size.chipMedium
|
|
||||||
static let chipBadge: CGFloat = CasinoDesign.Size.chipBadge
|
|
||||||
static let chipBadgeInner: CGFloat = CasinoDesign.Size.chipBadgeInner
|
|
||||||
|
|
||||||
// Shared values
|
|
||||||
static let valueBadge: CGFloat = CasinoDesign.Size.valueBadge
|
|
||||||
static let checkmark: CGFloat = CasinoDesign.Size.checkmark
|
|
||||||
static let maxContentWidthPortrait: CGFloat = CasinoDesign.Size.maxContentWidthPortrait
|
|
||||||
static let maxContentWidthLandscape: CGFloat = CasinoDesign.Size.maxContentWidthLandscape
|
|
||||||
static let maxModalWidth: CGFloat = CasinoDesign.Size.maxModalWidth
|
|
||||||
|
|
||||||
// Baccarat-specific table layout
|
|
||||||
static let tableAspectRatio: CGFloat = 1.6
|
static let tableAspectRatio: CGFloat = 1.6
|
||||||
static let roadMapCell: CGFloat = 16
|
static let roadMapCell: CGFloat = 16
|
||||||
static let diamondIcon: CGFloat = 24
|
static let diamondIcon: CGFloat = 24
|
||||||
static let topBetRowHeight: CGFloat = 52
|
static let topBetRowHeight: CGFloat = 40
|
||||||
static let mainBetRowHeight: CGFloat = 65
|
static let mainBetRowHeight: CGFloat = 50
|
||||||
static let bonusZoneWidth: CGFloat = 80
|
static let bonusZoneWidth: CGFloat = 80
|
||||||
|
|
||||||
|
// Labels
|
||||||
|
static let labelFontSize: CGFloat = 14
|
||||||
|
static let labelRowHeight: CGFloat = 30
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,11 +61,9 @@ extension Color {
|
|||||||
/// Typealias for consistent table colors across all games.
|
/// Typealias for consistent table colors across all games.
|
||||||
typealias Table = CasinoTable
|
typealias Table = CasinoTable
|
||||||
|
|
||||||
// MARK: - Border Colors
|
// MARK: - Border Colors (Baccarat-specific)
|
||||||
|
|
||||||
enum Border {
|
enum Border {
|
||||||
static let goldLight = CasinoTable.goldLight
|
|
||||||
static let goldDark = CasinoTable.goldDark
|
|
||||||
static let gold = Color(red: 0.7, green: 0.55, blue: 0.25)
|
static let gold = Color(red: 0.7, green: 0.55, blue: 0.25)
|
||||||
static let silver = Color(red: 0.6, green: 0.6, blue: 0.65)
|
static let silver = Color(red: 0.6, green: 0.6, blue: 0.65)
|
||||||
}
|
}
|
||||||
@ -140,77 +92,6 @@ extension Color {
|
|||||||
static let dragonBonusDark = Color(red: 0.15, green: 0.2, blue: 0.35)
|
static let dragonBonusDark = Color(red: 0.15, green: 0.2, blue: 0.35)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Button Colors
|
|
||||||
|
|
||||||
enum Button {
|
|
||||||
static let goldLight = Color(red: 1.0, green: 0.85, blue: 0.3)
|
|
||||||
static let goldDark = Color(red: 0.9, green: 0.7, blue: 0.2)
|
|
||||||
static let destructive = Color(red: 0.6, green: 0.2, blue: 0.2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Chip Colors (for theming)
|
|
||||||
|
|
||||||
enum Chip {
|
|
||||||
static let gold = Color(red: 0.8, green: 0.65, blue: 0.2)
|
|
||||||
|
|
||||||
// Chip base colors by denomination
|
|
||||||
static let tenBase = Color(red: 0.2, green: 0.4, blue: 0.8)
|
|
||||||
static let tenHighlight = Color(red: 0.3, green: 0.5, blue: 0.9)
|
|
||||||
static let twentyFiveBase = Color(red: 0.1, green: 0.6, blue: 0.3)
|
|
||||||
static let twentyFiveHighlight = Color(red: 0.2, green: 0.7, blue: 0.4)
|
|
||||||
static let fiftyBase = Color(red: 0.8, green: 0.5, blue: 0.1)
|
|
||||||
static let fiftyHighlight = Color(red: 0.9, green: 0.6, blue: 0.2)
|
|
||||||
static let hundredBase = Color(red: 0.1, green: 0.1, blue: 0.1)
|
|
||||||
static let hundredHighlight = Color(red: 0.3, green: 0.3, blue: 0.3)
|
|
||||||
static let fiveHundredBase = Color(red: 0.6, green: 0.2, blue: 0.6)
|
|
||||||
static let fiveHundredHighlight = Color(red: 0.7, green: 0.3, blue: 0.7)
|
|
||||||
static let thousandBase = Color(red: 0.8, green: 0.65, blue: 0.2)
|
|
||||||
static let thousandHighlight = Color(red: 0.9, green: 0.75, blue: 0.3)
|
|
||||||
static let fiveThousandBase = Color(red: 0.7, green: 0.1, blue: 0.2)
|
|
||||||
static let fiveThousandHighlight = Color(red: 0.85, green: 0.2, blue: 0.3)
|
|
||||||
static let tenThousandBase = Color(red: 0.2, green: 0.5, blue: 0.5)
|
|
||||||
static let tenThousandHighlight = Color(red: 0.3, green: 0.6, blue: 0.6)
|
|
||||||
static let twentyFiveThousandBase = Color(red: 0.5, green: 0.3, blue: 0.1)
|
|
||||||
static let twentyFiveThousandHighlight = Color(red: 0.65, green: 0.45, blue: 0.2)
|
|
||||||
static let fiftyThousandBase = Color(red: 0.75, green: 0.75, blue: 0.8)
|
|
||||||
static let fiftyThousandHighlight = Color(red: 0.85, green: 0.85, blue: 0.9)
|
|
||||||
static let hundredThousandBase = Color(red: 0.9, green: 0.1, blue: 0.3)
|
|
||||||
static let hundredThousandHighlight = Color(red: 1.0, green: 0.2, blue: 0.4)
|
|
||||||
|
|
||||||
// Accent stripe colors
|
|
||||||
static let goldStripe = Color(red: 0.9, green: 0.75, blue: 0.3)
|
|
||||||
static let darkStripe = Color(red: 0.2, green: 0.2, blue: 0.3)
|
|
||||||
static let goldRubyStripe = Color(red: 0.9, green: 0.85, blue: 0.3)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Card Colors
|
|
||||||
|
|
||||||
enum Card {
|
|
||||||
// Card back
|
|
||||||
static let backDark = Color(red: 0.6, green: 0.1, blue: 0.15)
|
|
||||||
static let backLight = Color(red: 0.4, green: 0.05, blue: 0.1)
|
|
||||||
static let patternLight = Color(red: 0.9, green: 0.7, blue: 0.4)
|
|
||||||
static let patternDark = Color(red: 0.7, green: 0.5, blue: 0.2)
|
|
||||||
static let innerDark = Color(red: 0.5, green: 0.08, blue: 0.12)
|
|
||||||
static let innerLight = Color(red: 0.35, green: 0.04, blue: 0.08)
|
|
||||||
static let diamondPattern = Color(red: 0.9, green: 0.7, blue: 0.4)
|
|
||||||
static let logoText = Color(red: 0.4, green: 0.05, blue: 0.1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Modal Colors
|
|
||||||
|
|
||||||
enum Modal {
|
|
||||||
static let backgroundLight = Color(red: 0.12, green: 0.12, blue: 0.14)
|
|
||||||
static let backgroundDark = Color(red: 0.08, green: 0.08, blue: 0.1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Settings Colors
|
|
||||||
|
|
||||||
enum Settings {
|
|
||||||
static let background = Color(red: 0.08, green: 0.12, blue: 0.18)
|
|
||||||
static let cardBackground = Color.white.opacity(CasinoDesign.Opacity.verySubtle)
|
|
||||||
static let accent = Color(red: 0.9, green: 0.75, blue: 0.3)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Localized Strings Helper
|
// MARK: - Localized Strings Helper
|
||||||
|
|||||||
@ -99,7 +99,7 @@ struct ActionButtonsView: View {
|
|||||||
.padding(Design.Spacing.medium + Design.Spacing.xxSmall)
|
.padding(Design.Spacing.medium + Design.Spacing.xxSmall)
|
||||||
.background(
|
.background(
|
||||||
Circle()
|
Circle()
|
||||||
.fill(Color.Button.destructive)
|
.fill(Color.CasinoButton.destructive)
|
||||||
)
|
)
|
||||||
.opacity(gameState.currentBets.isEmpty ? Design.Opacity.disabled : 1.0)
|
.opacity(gameState.currentBets.isEmpty ? Design.Opacity.disabled : 1.0)
|
||||||
.disabled(gameState.currentBets.isEmpty)
|
.disabled(gameState.currentBets.isEmpty)
|
||||||
@ -112,7 +112,7 @@ struct ActionButtonsView: View {
|
|||||||
.padding(.vertical, Design.Spacing.medium + Design.Spacing.xxSmall)
|
.padding(.vertical, Design.Spacing.medium + Design.Spacing.xxSmall)
|
||||||
.background(
|
.background(
|
||||||
Capsule()
|
Capsule()
|
||||||
.fill(Color.Button.destructive)
|
.fill(Color.CasinoButton.destructive)
|
||||||
)
|
)
|
||||||
.opacity(gameState.currentBets.isEmpty ? Design.Opacity.disabled : 1.0)
|
.opacity(gameState.currentBets.isEmpty ? Design.Opacity.disabled : 1.0)
|
||||||
.disabled(gameState.currentBets.isEmpty)
|
.disabled(gameState.currentBets.isEmpty)
|
||||||
@ -122,7 +122,7 @@ struct ActionButtonsView: View {
|
|||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var dealButton: some View {
|
private var dealButton: some View {
|
||||||
let buttonBackground = LinearGradient(
|
let buttonBackground = LinearGradient(
|
||||||
colors: [Color.Button.goldLight, Color.Button.goldDark],
|
colors: [Color.CasinoButton.goldLight, Color.CasinoButton.goldDark],
|
||||||
startPoint: .top,
|
startPoint: .top,
|
||||||
endPoint: .bottom
|
endPoint: .bottom
|
||||||
)
|
)
|
||||||
@ -160,7 +160,7 @@ struct ActionButtonsView: View {
|
|||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var newRoundButton: some View {
|
private var newRoundButton: some View {
|
||||||
let buttonBackground = LinearGradient(
|
let buttonBackground = LinearGradient(
|
||||||
colors: [Color.Button.goldLight, Color.Button.goldDark],
|
colors: [Color.CasinoButton.goldLight, Color.CasinoButton.goldDark],
|
||||||
startPoint: .top,
|
startPoint: .top,
|
||||||
endPoint: .bottom
|
endPoint: .bottom
|
||||||
)
|
)
|
||||||
|
|||||||
@ -54,7 +54,7 @@ struct GameTableView: View {
|
|||||||
|
|
||||||
/// Maximum width for game content on large screens
|
/// Maximum width for game content on large screens
|
||||||
private var maxContentWidth: CGFloat {
|
private var maxContentWidth: CGFloat {
|
||||||
isLandscape ? Design.Size.maxContentWidthLandscape : Design.Size.maxContentWidthPortrait
|
isLandscape ? CasinoDesign.Size.maxContentWidthLandscape : CasinoDesign.Size.maxContentWidthPortrait
|
||||||
}
|
}
|
||||||
|
|
||||||
private var state: GameState {
|
private var state: GameState {
|
||||||
|
|||||||
@ -18,7 +18,7 @@ struct GameOverView: View {
|
|||||||
|
|
||||||
/// Maximum width for the modal card on iPad
|
/// Maximum width for the modal card on iPad
|
||||||
private var maxModalWidth: CGFloat {
|
private var maxModalWidth: CGFloat {
|
||||||
horizontalSizeClass == .regular ? Design.Size.maxModalWidth : .infinity
|
horizontalSizeClass == .regular ? CasinoDesign.Size.maxModalWidth : .infinity
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Scaled Font Sizes (Dynamic Type)
|
// MARK: - Scaled Font Sizes (Dynamic Type)
|
||||||
@ -134,7 +134,7 @@ struct GameOverView: View {
|
|||||||
Capsule()
|
Capsule()
|
||||||
.fill(
|
.fill(
|
||||||
LinearGradient(
|
LinearGradient(
|
||||||
colors: [Color.Button.goldLight, Color.Button.goldDark],
|
colors: [Color.CasinoButton.goldLight, Color.CasinoButton.goldDark],
|
||||||
startPoint: .top,
|
startPoint: .top,
|
||||||
endPoint: .bottom
|
endPoint: .bottom
|
||||||
)
|
)
|
||||||
@ -149,7 +149,7 @@ struct GameOverView: View {
|
|||||||
RoundedRectangle(cornerRadius: modalCornerRadius)
|
RoundedRectangle(cornerRadius: modalCornerRadius)
|
||||||
.fill(
|
.fill(
|
||||||
LinearGradient(
|
LinearGradient(
|
||||||
colors: [Color.Modal.backgroundLight, Color.Modal.backgroundDark],
|
colors: [Color.CasinoModal.backgroundLight, Color.CasinoModal.backgroundDark],
|
||||||
startPoint: .top,
|
startPoint: .top,
|
||||||
endPoint: .bottom
|
endPoint: .bottom
|
||||||
)
|
)
|
||||||
|
|||||||
@ -35,7 +35,7 @@ struct ResultBannerView: View {
|
|||||||
|
|
||||||
/// Maximum width for the banner card on iPad
|
/// Maximum width for the banner card on iPad
|
||||||
private var maxBannerWidth: CGFloat {
|
private var maxBannerWidth: CGFloat {
|
||||||
horizontalSizeClass == .regular ? Design.Size.maxModalWidth : .infinity
|
horizontalSizeClass == .regular ? CasinoDesign.Size.maxModalWidth : .infinity
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Scaled Font Sizes (Dynamic Type)
|
// MARK: - Scaled Font Sizes (Dynamic Type)
|
||||||
@ -151,7 +151,7 @@ struct ResultBannerView: View {
|
|||||||
Capsule()
|
Capsule()
|
||||||
.fill(
|
.fill(
|
||||||
LinearGradient(
|
LinearGradient(
|
||||||
colors: [Color.Button.goldLight, Color.Button.goldDark],
|
colors: [Color.CasinoButton.goldLight, Color.CasinoButton.goldDark],
|
||||||
startPoint: .top,
|
startPoint: .top,
|
||||||
endPoint: .bottom
|
endPoint: .bottom
|
||||||
)
|
)
|
||||||
@ -177,7 +177,7 @@ struct ResultBannerView: View {
|
|||||||
Capsule()
|
Capsule()
|
||||||
.fill(
|
.fill(
|
||||||
LinearGradient(
|
LinearGradient(
|
||||||
colors: [Color.Button.goldLight, Color.Button.goldDark],
|
colors: [Color.CasinoButton.goldLight, Color.CasinoButton.goldDark],
|
||||||
startPoint: .top,
|
startPoint: .top,
|
||||||
endPoint: .bottom
|
endPoint: .bottom
|
||||||
)
|
)
|
||||||
|
|||||||
@ -120,7 +120,7 @@ struct RulesHelpView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
ZStack {
|
ZStack {
|
||||||
Color.Settings.background
|
Color.Sheet.background
|
||||||
.ignoresSafeArea()
|
.ignoresSafeArea()
|
||||||
|
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
@ -137,7 +137,7 @@ struct RulesHelpView: View {
|
|||||||
HStack(spacing: Design.Spacing.small) {
|
HStack(spacing: Design.Spacing.small) {
|
||||||
ForEach(pages.indices, id: \.self) { index in
|
ForEach(pages.indices, id: \.self) { index in
|
||||||
Circle()
|
Circle()
|
||||||
.fill(index == currentPage ? Color.Settings.accent : Color.white.opacity(Design.Opacity.light))
|
.fill(index == currentPage ? Color.Sheet.accent : Color.white.opacity(Design.Opacity.light))
|
||||||
.frame(width: 8, height: 8)
|
.frame(width: 8, height: 8)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,10 +151,10 @@ struct RulesHelpView: View {
|
|||||||
Button(String(localized: "Done")) {
|
Button(String(localized: "Done")) {
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
.foregroundStyle(Color.Settings.accent)
|
.foregroundStyle(Color.Sheet.accent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.toolbarBackground(Color.Settings.background, for: .navigationBar)
|
.toolbarBackground(Color.Sheet.background, for: .navigationBar)
|
||||||
.toolbarColorScheme(.dark, for: .navigationBar)
|
.toolbarColorScheme(.dark, for: .navigationBar)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -184,7 +184,7 @@ struct RulePageView: View {
|
|||||||
// Icon
|
// Icon
|
||||||
Image(systemName: page.icon)
|
Image(systemName: page.icon)
|
||||||
.font(.system(size: iconSize))
|
.font(.system(size: iconSize))
|
||||||
.foregroundStyle(Color.Settings.accent)
|
.foregroundStyle(Color.Sheet.accent)
|
||||||
.padding(.top, Design.Spacing.xxLarge)
|
.padding(.top, Design.Spacing.xxLarge)
|
||||||
|
|
||||||
// Title
|
// Title
|
||||||
@ -197,7 +197,7 @@ struct RulePageView: View {
|
|||||||
ForEach(page.content.indices, id: \.self) { index in
|
ForEach(page.content.indices, id: \.self) { index in
|
||||||
HStack(alignment: .top, spacing: Design.Spacing.medium) {
|
HStack(alignment: .top, spacing: Design.Spacing.medium) {
|
||||||
Text("•")
|
Text("•")
|
||||||
.foregroundStyle(Color.Settings.accent)
|
.foregroundStyle(Color.Sheet.accent)
|
||||||
|
|
||||||
Text(page.content[index])
|
Text(page.content[index])
|
||||||
.font(.system(size: bodySize))
|
.font(.system(size: bodySize))
|
||||||
|
|||||||
@ -27,7 +27,7 @@ struct SettingsView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Accent color for settings components
|
/// Accent color for settings components
|
||||||
private let accent = Color.Settings.accent
|
private let accent = Color.Sheet.accent
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
SheetContainerView(
|
SheetContainerView(
|
||||||
@ -334,7 +334,7 @@ struct DeckCountPicker: View {
|
|||||||
title: count.displayName,
|
title: count.displayName,
|
||||||
subtitle: count.description,
|
subtitle: count.description,
|
||||||
isSelected: selection == count,
|
isSelected: selection == count,
|
||||||
accentColor: Color.Settings.accent,
|
accentColor: Color.Sheet.accent,
|
||||||
action: { selection = count }
|
action: { selection = count }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -354,8 +354,8 @@ struct TableLimitsPicker: View {
|
|||||||
title: limit.displayName,
|
title: limit.displayName,
|
||||||
subtitle: limit.detailedDescription,
|
subtitle: limit.detailedDescription,
|
||||||
isSelected: selection == limit,
|
isSelected: selection == limit,
|
||||||
accentColor: Color.Settings.accent,
|
accentColor: Color.Sheet.accent,
|
||||||
badge: { BadgePill(text: limit.description, isSelected: selection == limit, accentColor: Color.Settings.accent) },
|
badge: { BadgePill(text: limit.description, isSelected: selection == limit, accentColor: Color.Sheet.accent) },
|
||||||
action: { selection = limit }
|
action: { selection = limit }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,12 +28,12 @@ struct BettingTableView: View {
|
|||||||
|
|
||||||
/// Top bet row height - shorter in landscape
|
/// Top bet row height - shorter in landscape
|
||||||
private var topRowHeight: CGFloat {
|
private var topRowHeight: CGFloat {
|
||||||
isLandscape ? 40 : Design.Size.topBetRowHeight
|
Design.Size.topBetRowHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Main bet row height - shorter in landscape
|
/// Main bet row height - shorter in landscape
|
||||||
private var mainRowHeight: CGFloat {
|
private var mainRowHeight: CGFloat {
|
||||||
isLandscape ? 50 : Design.Size.mainBetRowHeight
|
Design.Size.mainBetRowHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Computed Properties
|
// MARK: - Computed Properties
|
||||||
@ -155,7 +155,7 @@ struct BettingTableView: View {
|
|||||||
RoundedRectangle(cornerRadius: Design.CornerRadius.large)
|
RoundedRectangle(cornerRadius: Design.CornerRadius.large)
|
||||||
.strokeBorder(
|
.strokeBorder(
|
||||||
LinearGradient(
|
LinearGradient(
|
||||||
colors: [Color.Border.goldLight, Color.Border.goldDark],
|
colors: [Color.CasinoTable.goldLight, Color.CasinoTable.goldDark],
|
||||||
startPoint: .top,
|
startPoint: .top,
|
||||||
endPoint: .bottom
|
endPoint: .bottom
|
||||||
),
|
),
|
||||||
@ -404,7 +404,7 @@ private struct MainBetZone: View {
|
|||||||
// Content - always centered
|
// Content - always centered
|
||||||
VStack(spacing: Design.Spacing.xxSmall + 1) {
|
VStack(spacing: Design.Spacing.xxSmall + 1) {
|
||||||
Text(title)
|
Text(title)
|
||||||
.font(.system(size: Design.BaseFontSize.xxLarge, weight: .black, design: .rounded))
|
.font(.system(size: Design.BaseFontSize.xLarge, weight: .black, design: .rounded))
|
||||||
.tracking(2)
|
.tracking(2)
|
||||||
|
|
||||||
Text(payoutText)
|
Text(payoutText)
|
||||||
@ -531,12 +531,12 @@ private struct ChipBadge: View {
|
|||||||
// Outer ring
|
// Outer ring
|
||||||
Circle()
|
Circle()
|
||||||
.fill(isMax ? Color.gray : Color.yellow)
|
.fill(isMax ? Color.gray : Color.yellow)
|
||||||
.frame(width: Design.Size.chipBadge, height: Design.Size.chipBadge)
|
.frame(width: CasinoDesign.Size.chipBadge, height: CasinoDesign.Size.chipBadge)
|
||||||
|
|
||||||
// Inner decoration
|
// Inner decoration
|
||||||
Circle()
|
Circle()
|
||||||
.strokeBorder(Color.white.opacity(Design.Opacity.almostFull), lineWidth: Design.LineWidth.standard)
|
.strokeBorder(Color.white.opacity(Design.Opacity.almostFull), lineWidth: Design.LineWidth.standard)
|
||||||
.frame(width: Design.Size.chipBadgeInner, height: Design.Size.chipBadgeInner)
|
.frame(width: CasinoDesign.Size.chipBadgeInner, height: CasinoDesign.Size.chipBadgeInner)
|
||||||
|
|
||||||
// Text
|
// Text
|
||||||
if isMax {
|
if isMax {
|
||||||
|
|||||||
@ -36,26 +36,14 @@ struct CardsDisplayArea: View {
|
|||||||
// Use global debug flag from Design constants
|
// Use global debug flag from Design constants
|
||||||
private var showDebugBorders: Bool { Design.showDebugBorders }
|
private var showDebugBorders: Bool { Design.showDebugBorders }
|
||||||
|
|
||||||
/// Label font size - scales differently for small devices, standard iPhones, and iPads
|
/// Label font size - larger on iPad
|
||||||
private var labelFontSize: CGFloat {
|
private var labelFontSize: CGFloat {
|
||||||
if isLargeScreen {
|
isLargeScreen ? 18 : Design.Size.labelFontSize
|
||||||
return 14 * Design.Size.handScale * Design.Size.largeScreenMultiplier
|
|
||||||
} else if DeviceInfo.isSmallDevice {
|
|
||||||
return 12 // Smaller font for iPhone SE
|
|
||||||
} else {
|
|
||||||
return 14 // Standard iPhone
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Minimum height for label row - scales differently for small devices, standard iPhones, and iPads
|
/// Minimum height for label row - larger on iPad
|
||||||
private var labelRowMinHeight: CGFloat {
|
private var labelRowMinHeight: CGFloat {
|
||||||
if isLargeScreen {
|
isLargeScreen ? 40 : Design.Size.labelRowHeight
|
||||||
return 30 * Design.Size.handScale * Design.Size.largeScreenMultiplier
|
|
||||||
} else if DeviceInfo.isSmallDevice {
|
|
||||||
return 24 // Smaller row for iPhone SE
|
|
||||||
} else {
|
|
||||||
return 30 // Standard iPhone
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Spacing between PLAYER and BANKER hands - reduced on smaller screens
|
/// Spacing between PLAYER and BANKER hands - reduced on smaller screens
|
||||||
|
|||||||
@ -27,25 +27,24 @@ struct CompactHandView: View {
|
|||||||
horizontalSizeClass == .regular
|
horizontalSizeClass == .regular
|
||||||
}
|
}
|
||||||
|
|
||||||
/// WIN badge font size - only scales on iPad
|
/// WIN badge font size - larger on iPad
|
||||||
private var winBadgeFontSize: CGFloat {
|
private var winBadgeFontSize: CGFloat {
|
||||||
let baseSize: CGFloat = 10
|
isLargeScreen ? 14 : 10
|
||||||
return isLargeScreen ? baseSize * Design.Size.handScale * Design.Size.largeScreenMultiplier : baseSize
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Card width - responsive based on device type (uses DeviceKit)
|
/// Card width - larger on iPad
|
||||||
private var cardWidth: CGFloat {
|
private var cardWidth: CGFloat {
|
||||||
isLargeScreen ? Design.Size.cardWidthTableLarge : Design.Size.cardWidthTable
|
isLargeScreen ? Design.Size.cardWidthTableiPad : Design.Size.cardWidthTable
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Card height based on aspect ratio
|
/// Card height based on aspect ratio
|
||||||
private var cardHeight: CGFloat {
|
private var cardHeight: CGFloat {
|
||||||
cardWidth * Design.Size.cardAspectRatio
|
cardWidth * CasinoDesign.Size.cardAspectRatio
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Card overlap - scaled with card size (uses DeviceKit)
|
/// Card overlap - larger on iPad
|
||||||
private var cardOverlap: CGFloat {
|
private var cardOverlap: CGFloat {
|
||||||
isLargeScreen ? Design.Size.cardOverlapLarge : Design.Size.cardOverlap
|
isLargeScreen ? Design.Size.cardOverlapiPad : Design.Size.cardOverlap
|
||||||
}
|
}
|
||||||
|
|
||||||
private let placeholderSpacing: CGFloat = Design.Spacing.small
|
private let placeholderSpacing: CGFloat = Design.Spacing.small
|
||||||
|
|||||||
@ -24,16 +24,18 @@ struct HandValueBadge: View {
|
|||||||
horizontalSizeClass == .regular
|
horizontalSizeClass == .regular
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Scale factor for badge sizing - only applies on iPad to avoid clipping on iPhone
|
|
||||||
private var scale: CGFloat {
|
|
||||||
isLargeScreen ? Design.Size.handScale * Design.Size.largeScreenMultiplier : 1.0
|
|
||||||
}
|
|
||||||
|
|
||||||
@ScaledMetric(relativeTo: .headline) private var baseValueFontSize: CGFloat = 15
|
@ScaledMetric(relativeTo: .headline) private var baseValueFontSize: CGFloat = 15
|
||||||
@ScaledMetric(relativeTo: .headline) private var baseBadgeSize: CGFloat = 26
|
@ScaledMetric(relativeTo: .headline) private var baseBadgeSize: CGFloat = 26
|
||||||
|
|
||||||
private var valueFontSize: CGFloat { baseValueFontSize * scale }
|
/// Font size - larger on iPad
|
||||||
private var badgeSize: CGFloat { baseBadgeSize * scale }
|
private var valueFontSize: CGFloat {
|
||||||
|
isLargeScreen ? baseValueFontSize * 1.5 : baseValueFontSize
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Badge size - larger on iPad
|
||||||
|
private var badgeSize: CGFloat {
|
||||||
|
isLargeScreen ? baseBadgeSize * 1.5 : baseBadgeSize
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Body
|
// MARK: - Body
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user