Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions SDDSComponents/SDDSComponents.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@
818C03B22C418A90002C6D0A /* SDDSSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818C03B12C418A90002C6D0A /* SDDSSwitch.swift */; };
818C03B52C418C50002C6D0A /* TypographyConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818C03B42C418C50002C6D0A /* TypographyConfiguration.swift */; };
818C03B92C43B99B002C6D0A /* ColorToken+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818C03B82C43B99B002C6D0A /* ColorToken+Extensions.swift */; };
81F2AA9A2F20010100ABCD01 /* StatefulColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F2AA992F20010100ABCD01 /* StatefulColor.swift */; };
818C03BF2C43C371002C6D0A /* DebugModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818C03BE2C43C371002C6D0A /* DebugModifier.swift */; };
818C03C52C4512A6002C6D0A /* SelectionControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818C03C42C4512A6002C6D0A /* SelectionControl.swift */; };
818C03C72C45140B002C6D0A /* CheckboxAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818C03C62C45140B002C6D0A /* CheckboxAppearance.swift */; };
Expand Down Expand Up @@ -765,6 +766,7 @@
818C03B12C418A90002C6D0A /* SDDSSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDDSSwitch.swift; sourceTree = "<group>"; };
818C03B42C418C50002C6D0A /* TypographyConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypographyConfiguration.swift; sourceTree = "<group>"; };
818C03B82C43B99B002C6D0A /* ColorToken+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ColorToken+Extensions.swift"; sourceTree = "<group>"; };
81F2AA992F20010100ABCD01 /* StatefulColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatefulColor.swift; sourceTree = "<group>"; };
818C03BE2C43C371002C6D0A /* DebugModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugModifier.swift; sourceTree = "<group>"; };
818C03C42C4512A6002C6D0A /* SelectionControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectionControl.swift; sourceTree = "<group>"; };
818C03C62C45140B002C6D0A /* CheckboxAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxAppearance.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2500,6 +2502,7 @@
81CBC0922C82241100FBDAC8 /* BackportAsyncImage */,
818C03B42C418C50002C6D0A /* TypographyConfiguration.swift */,
818C03B82C43B99B002C6D0A /* ColorToken+Extensions.swift */,
81F2AA992F20010100ABCD01 /* StatefulColor.swift */,
818C03BE2C43C371002C6D0A /* DebugModifier.swift */,
818C03E22C479003002C6D0A /* Image+Extensions.swift */,
8159F72F2C5D1CFE00622836 /* FillStyle.swift */,
Expand Down Expand Up @@ -4913,6 +4916,7 @@
812DB7562D57B44100D3F4A3 /* TextFieldAccessibility.swift in Sources */,
81F7532E2CF4689C000156D9 /* ButtonAccessibility.swift in Sources */,
818C03B92C43B99B002C6D0A /* ColorToken+Extensions.swift in Sources */,
81F2AA9A2F20010100ABCD01 /* StatefulColor.swift in Sources */,
817339E92D033E8E0092608A /* AvatarAppearance.swift in Sources */,
811DE1712C5783B6000DD354 /* HierarchicalList.swift in Sources */,
818C03D02C451651002C6D0A /* SelectionControlAppearance.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,7 @@ public extension ColorToken {
}

var buttonColor: ButtonColor {
ButtonColor(
defaultColor: self,
highlightedColor: self,
hoveredColor: self,
selectedColor: self
)
ButtonColor(defaultColor: self)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import Foundation
@_exported import SDDSThemeCore

public typealias StatefulColor = SDDSThemeCore.StatefulColor
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ import SwiftUI
- size: Конфигурация размеров кнопки, определяемая `ButtonSizeConfiguration`.
- shapeStyle: Стиль формы кнопки (например, закругленная или овальная), определяемый `ButtonShapeStyle`.
- titleTypography: Типографика для текста заголовка кнопки, определяемая `TypographyConfiguration`.
- titleColor: Цвет текста заголовка кнопки для различных состояний, определяемый `ButtonColor`.
- titleColor: Цвет текста заголовка кнопки для различных состояний, определяемый `StatefulColor`.
- subtitleTypography: Типографика для текста подзаголовка кнопки, определяемая `TypographyConfiguration`.
- subtitleColor: Цвет текста подзаголовка кнопки для различных состояний, определяемый `ButtonColor`.
- iconColor: Цвет иконки кнопки для различных состояний, определяемый `ButtonColor`.
- spinnerColor: Цвет спиннера загрузки для различных состояний, определяемый `ButtonColor`.
- backgroundColor: Цвет фона кнопки для различных состояний, определяемый `ButtonColor`.
- subtitleColor: Цвет текста подзаголовка кнопки для различных состояний, определяемый `StatefulColor`.
- iconColor: Цвет иконки кнопки для различных состояний, определяемый `StatefulColor`.
- spinnerColor: Цвет спиннера загрузки для различных состояний, определяемый `StatefulColor`.
- backgroundColor: Цвет фона кнопки для различных состояний, определяемый `StatefulColor`.
- disabledAlpha: Прозрачность кнопки, когда она отключена.
- loadingAlpha: Прозрачность кнопки, когда она находится в состоянии загрузки.

Expand All @@ -38,8 +38,9 @@ public struct ButtonAppearance {
public var titleTypography: TypographyConfiguration

/**
Цвет текста заголовка кнопки для различных состояний, определяемый `ButtonColor`.
Цвет текста заголовка кнопки для различных состояний, определяемый `StatefulColor`.
*/
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var titleColor: ButtonColor

/**
Expand All @@ -48,23 +49,27 @@ public struct ButtonAppearance {
public var subtitleTypography: TypographyConfiguration

/**
Цвет текста подзаголовка кнопки для различных состояний, определяемый `ButtonColor`.
Цвет текста подзаголовка кнопки для различных состояний, определяемый `StatefulColor`.
*/
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var subtitleColor: ButtonColor

/**
Цвет иконки кнопки для различных состояний, определяемый `ButtonColor`.
Цвет иконки кнопки для различных состояний, определяемый `StatefulColor`.
*/
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var iconColor: ButtonColor

/**
Цвет спиннера загрузки для различных состояний, определяемый `ButtonColor`.
Цвет спиннера загрузки для различных состояний, определяемый `StatefulColor`.
*/
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var spinnerColor: ButtonColor

/**
Цвет фона кнопки для различных состояний, определяемый `ButtonColor`.
Цвет фона кнопки для различных состояний, определяемый `StatefulColor`.
*/
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var backgroundColor: ButtonColor

/**
Expand Down Expand Up @@ -118,6 +123,8 @@ public struct ButtonAppearance {
self.disabledAlpha = disabledAlpha
self.loadingAlpha = loadingAlpha
}


}

extension ButtonAppearance: EnvironmentKey {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,46 +1,24 @@
import Foundation
import SwiftUI
@_exported import SDDSThemeCore

/**
`ButtonColor` определяет цвета кнопки для различных состояний.

- Properties:
- defaultColor: Цвет для стандартного состояния кнопки.
- highlightedColor: Цвет для состояния, когда кнопка нажата.
- hoveredColor: Цвет для состояния, когда кнопка находится под курсором.
*/
@available(*, deprecated, message: "Use StatefulColor instead.")
public struct ButtonColor: Hashable {
/**
Цвет для стандартного состояния кнопки.
*/
public let defaultColor: ColorToken

/**
Цвет для состояния, когда кнопка нажата.
*/
public let highlightedColor: ColorToken

/**
Цвет для состояния, когда кнопка находится под курсором.
*/
public let hoveredColor: ColorToken

/**
Цвет, используемый для кнопки, когда она находится в выбранном состоянии.
Этот цвет применяется к кнопке, когда она выбрана в контейнере элементов.
*/
public let selectedColor: ColorToken
public var defaultColor: ColorToken {
didSet { rawStatefulColor = nil }
}
public var highlightedColor: ColorToken {
didSet { rawStatefulColor = nil }
}
public var hoveredColor: ColorToken {
didSet { rawStatefulColor = nil }
}
public var selectedColor: ColorToken {
didSet { rawStatefulColor = nil }
}

/**
Инициализатор для создания `ButtonColor`.

- Parameters:
- defaultColor: Цвет для стандартного состояния.
- highlightedColor: Цвет для состояния нажатия.
- hoveredColor: Цвет для состояния наведения.
- selectedColor: Цвет для в выбранном состоянии

*/
private var rawStatefulColor: StatefulColor?

public init(
defaultColor: ColorToken = .clearColor,
highlightedColor: ColorToken = .clearColor,
Expand All @@ -51,19 +29,89 @@ public struct ButtonColor: Hashable {
self.highlightedColor = highlightedColor
self.hoveredColor = hoveredColor
self.selectedColor = selectedColor
self.rawStatefulColor = nil
}

public static func == (lhs: ButtonColor, rhs: ButtonColor) -> Bool {
lhs.defaultColor == rhs.defaultColor &&
lhs.highlightedColor == rhs.highlightedColor &&
lhs.hoveredColor == rhs.hoveredColor &&
lhs.selectedColor == rhs.selectedColor

public var statefulColor: StatefulColor {
rawStatefulColor ?? StatefulColor(
defaultValue: defaultColor,
values: [
.init(states: [InteractiveState.pressed], value: highlightedColor),
.init(states: [InteractiveState.hovered], value: hoveredColor),
.init(states: [InteractiveState.selected], value: selectedColor),
.init(states: [InteractiveState.activated], value: selectedColor)
]
)
}

public func hash(into hasher: inout Hasher) {
hasher.combine(defaultColor)
hasher.combine(highlightedColor)
hasher.combine(hoveredColor)
hasher.combine(selectedColor)

public init(_ statefulColor: StatefulColor) {
self.defaultColor = statefulColor.resolvedDefaultValue()
self.highlightedColor = statefulColor.resolvedValue(for: Set([InteractiveState.pressed]))
self.hoveredColor = statefulColor.resolvedValue(for: Set([InteractiveState.hovered]))
let selectedValue = statefulColor.resolvedValue(for: Set([InteractiveState.selected]))
let activatedValue = statefulColor.resolvedValue(for: Set([InteractiveState.activated]))
self.selectedColor = selectedValue != defaultColor ? selectedValue : activatedValue
self.rawStatefulColor = statefulColor
}
}

public extension ButtonColor {
func resolvedDefaultValue() -> ColorToken {
statefulColor.resolvedDefaultValue()
}

func resolvedValue(for activeStates: Set<InteractiveState>) -> ColorToken {
statefulColor.resolvedValue(for: activeStates)
}

func resolvedValue(for activeStates: Set<String>) -> ColorToken {
statefulColor.resolvedValue(for: activeStates)
}

func color(
for activeStates: Set<InteractiveState>,
colorScheme: ColorScheme,
subtheme: SubthemeData = SubthemeData()
) -> Color {
statefulColor.color(for: activeStates, colorScheme: colorScheme, subtheme: subtheme)
}
}

public extension SDDSThemeCore.StatefulColor {
@available(*, deprecated, message: "Use StatefulColor(defaultValue:values:) with state entries instead.")
init(
defaultColor: ColorToken = .clearColor,
highlightedColor: ColorToken = .clearColor,
hoveredColor: ColorToken = .clearColor,
selectedColor: ColorToken = .clearColor
) {
self.init(
defaultValue: defaultColor,
values: [
.init(states: [InteractiveState.pressed], value: highlightedColor),
.init(states: [InteractiveState.hovered], value: hoveredColor),
.init(states: [InteractiveState.selected], value: selectedColor)
]
)
}

@available(*, deprecated, message: "Use resolvedValue(for:) with an explicit state set.")
var defaultColor: ColorToken {
resolvedDefaultValue()
}

@available(*, deprecated, message: "Use resolvedValue(for:) with an explicit state set.")
var highlightedColor: ColorToken {
resolvedValue(for: Set([InteractiveState.pressed]))
}

@available(*, deprecated, message: "Use resolvedValue(for:) with an explicit state set.")
var hoveredColor: ColorToken {
resolvedValue(for: Set([InteractiveState.hovered]))
}

@available(*, deprecated, message: "Use resolvedValue(for:) with an explicit state set.")
var selectedColor: ColorToken {
resolvedValue(for: Set([InteractiveState.selected]))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -281,15 +281,11 @@ public extension SDDSButton where Counter == EmptyView {

private extension SDDSButton {
func currentColor(for buttonColor: ButtonColor) -> Color {
if isSelected {
return buttonColor.selectedColor.color(for: colorScheme, subtheme: subtheme)
} else if isHighlighted {
return buttonColor.highlightedColor.color(for: colorScheme, subtheme: subtheme)
} else if isHovered {
return buttonColor.hoveredColor.color(for: colorScheme, subtheme: subtheme)
} else {
return buttonColor.defaultColor.color(for: colorScheme, subtheme: subtheme)
}
var activeStates = Set<InteractiveState>()
if isSelected { activeStates.insert(.selected) }
if isHighlighted { activeStates.insert(.pressed) }
if isHovered { activeStates.insert(.hovered) }
return buttonColor.color(for: activeStates, colorScheme: colorScheme, subtheme: subtheme)
}

func hasIconAttributes() -> Bool {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@ import SwiftUI
public struct ChipAppearance: Hashable {
let id = UUID()
public var size: ChipSizeConfiguration
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var titleColor: ButtonColor
public var titleTypography: TypographyConfiguration
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var imageTintColor: ButtonColor
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var buttonTintColor: ButtonColor
@available(*, deprecated, message: "ButtonColor is deprecated and will be replaced by StatefulColor in a future release.")
public var backgroundColor: ButtonColor
public var disabledAlpha: CGFloat

Expand All @@ -41,6 +45,8 @@ public struct ChipAppearance: Hashable {
self.backgroundColor = backgroundColor
self.disabledAlpha = disabledAlpha
}



public static func == (lhs: ChipAppearance, rhs: ChipAppearance) -> Bool {
lhs.id == rhs.id &&
Expand Down
Loading
Loading