110 lines
3.3 KiB
Swift
110 lines
3.3 KiB
Swift
//
|
|
// TextLink.swift
|
|
// VDS
|
|
//
|
|
// Created by Matt Bruce on 11/1/22.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
import VDSColorTokens
|
|
import VDSFormControlsTokens
|
|
import Combine
|
|
|
|
@objc(VDSTextLink)
|
|
open class TextLink: ButtonBase {
|
|
|
|
//--------------------------------------------------
|
|
// MARK: - Private Properties
|
|
//--------------------------------------------------
|
|
private var lineHeightConstraint: NSLayoutConstraint?
|
|
|
|
//--------------------------------------------------
|
|
// MARK: - Properties
|
|
//--------------------------------------------------
|
|
open var size: ButtonSize = .large { didSet { didChange() }}
|
|
|
|
open override var availableSizes: [ButtonSize] { [.large, .small] }
|
|
|
|
open override var typograpicalStyle: TypographicalStyle {
|
|
size == .large ? TypographicalStyle.BodyLarge : TypographicalStyle.BodySmall
|
|
}
|
|
|
|
open override var textColor: UIColor {
|
|
textColorConfiguration.getColor(self)
|
|
}
|
|
|
|
private var textColorConfiguration = ControlColorConfiguration().with {
|
|
$0.setSurfaceColors(VDSColor.elementsPrimaryOnlight, VDSColor.elementsPrimaryOndark, forState: .normal)
|
|
$0.setSurfaceColors(VDSColor.elementsSecondaryOnlight, VDSColor.elementsSecondaryOndark, forState: .disabled)
|
|
$0.setSurfaceColors(VDSColor.interactiveActiveOnlight, VDSColor.interactiveActiveOndark, forState: .highlighted)
|
|
}
|
|
|
|
private var height: CGFloat {
|
|
switch size {
|
|
case .large:
|
|
return 44
|
|
case .small:
|
|
return 32
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------
|
|
// MARK: - Initializers
|
|
//--------------------------------------------------
|
|
required public init() {
|
|
super.init(frame: .zero)
|
|
}
|
|
|
|
public override init(frame: CGRect) {
|
|
super.init(frame: .zero)
|
|
}
|
|
|
|
public required init?(coder: NSCoder) {
|
|
super.init(coder: coder)
|
|
}
|
|
|
|
private var line = UIView().with {
|
|
$0.translatesAutoresizingMaskIntoConstraints = false
|
|
}
|
|
|
|
//--------------------------------------------------
|
|
// MARK: - Public Functions
|
|
//--------------------------------------------------
|
|
open override func setup() {
|
|
super.setup()
|
|
|
|
if let titleLabel {
|
|
addSubview(line)
|
|
line.pinLeading(titleLabel.leadingAnchor)
|
|
line.pinTrailing(titleLabel.trailingAnchor)
|
|
line.pinTop(titleLabel.bottomAnchor, 1)
|
|
lineHeightConstraint = line.heightAnchor.constraint(equalToConstant: 1.0)
|
|
lineHeightConstraint?.isActive = true
|
|
}
|
|
}
|
|
|
|
open override func reset() {
|
|
super.reset()
|
|
size = .large
|
|
accessibilityCustomActions = []
|
|
accessibilityTraits = .staticText
|
|
}
|
|
|
|
//--------------------------------------------------
|
|
// MARK: - Overrides
|
|
//--------------------------------------------------
|
|
open override var intrinsicContentSize: CGSize {
|
|
return titleLabel?.intrinsicContentSize ?? super.intrinsicContentSize
|
|
}
|
|
|
|
open override func updateView() {
|
|
//need to set the properties so the super class
|
|
//can render out the label correctly
|
|
line.backgroundColor = textColor
|
|
|
|
//always call last so the label is rendered
|
|
super.updateView()
|
|
}
|
|
}
|