Compare commits
5 Commits
develop
...
feature/ti
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e7b3acc42 | ||
|
|
4484034b4c | ||
|
|
2e519eee28 | ||
|
|
c3c133cac7 | ||
|
|
b974e63931 |
@ -23,8 +23,6 @@
|
|||||||
1842B1E12BECE7B70021AFCA /* CalendarHeaderReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1842B1E02BECE7B70021AFCA /* CalendarHeaderReusableView.swift */; };
|
1842B1E12BECE7B70021AFCA /* CalendarHeaderReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1842B1E02BECE7B70021AFCA /* CalendarHeaderReusableView.swift */; };
|
||||||
1842B1E32BECF0A20021AFCA /* CalendarFooterReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1842B1E22BECF0A10021AFCA /* CalendarFooterReusableView.swift */; };
|
1842B1E32BECF0A20021AFCA /* CalendarFooterReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1842B1E22BECF0A10021AFCA /* CalendarFooterReusableView.swift */; };
|
||||||
1855EC662BAABF2A002ACAC2 /* BreadcrumbItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1855EC652BAABF2A002ACAC2 /* BreadcrumbItemModel.swift */; };
|
1855EC662BAABF2A002ACAC2 /* BreadcrumbItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1855EC652BAABF2A002ACAC2 /* BreadcrumbItemModel.swift */; };
|
||||||
1859B30F2CBF6FEB0031CD70 /* ListUnordered.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1859B30E2CBF6FDD0031CD70 /* ListUnordered.swift */; };
|
|
||||||
1859B31B2CBFA0180031CD70 /* ListUnorderedItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1859B31A2CBFA0180031CD70 /* ListUnorderedItemModel.swift */; };
|
|
||||||
186D13CB2BBA8B1500986B53 /* DropdownSelect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 186D13CA2BBA8B1500986B53 /* DropdownSelect.swift */; };
|
186D13CB2BBA8B1500986B53 /* DropdownSelect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 186D13CA2BBA8B1500986B53 /* DropdownSelect.swift */; };
|
||||||
18792A902B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18792A8F2B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift */; };
|
18792A902B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18792A8F2B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift */; };
|
||||||
18926F5B2C7616A500C55BF6 /* FootnoteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18926F5A2C7616A500C55BF6 /* FootnoteItem.swift */; };
|
18926F5B2C7616A500C55BF6 /* FootnoteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18926F5A2C7616A500C55BF6 /* FootnoteItem.swift */; };
|
||||||
@ -212,6 +210,8 @@
|
|||||||
EAF7F11728A1475A00B287F5 /* RadioButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F11528A1475A00B287F5 /* RadioButtonItem.swift */; };
|
EAF7F11728A1475A00B287F5 /* RadioButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F11528A1475A00B287F5 /* RadioButtonItem.swift */; };
|
||||||
EAF7F13328A2A16500B287F5 /* AttachmentLabelAttributeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F13228A2A16500B287F5 /* AttachmentLabelAttributeModel.swift */; };
|
EAF7F13328A2A16500B287F5 /* AttachmentLabelAttributeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F13228A2A16500B287F5 /* AttachmentLabelAttributeModel.swift */; };
|
||||||
EAF978212A99035B00C2FEA9 /* Enabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF978202A99035B00C2FEA9 /* Enabling.swift */; };
|
EAF978212A99035B00C2FEA9 /* Enabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF978202A99035B00C2FEA9 /* Enabling.swift */; };
|
||||||
|
EAFD5AA02CB5CA5300C87DE1 /* TileletGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAFD5A9F2CB5CA5300C87DE1 /* TileletGroup.swift */; };
|
||||||
|
EAFD5AA22CB5CA7900C87DE1 /* TileletGroupFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAFD5AA12CB5CA7900C87DE1 /* TileletGroupFlowLayout.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -243,9 +243,6 @@
|
|||||||
1842B1E22BECF0A10021AFCA /* CalendarFooterReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarFooterReusableView.swift; sourceTree = "<group>"; };
|
1842B1E22BECF0A10021AFCA /* CalendarFooterReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarFooterReusableView.swift; sourceTree = "<group>"; };
|
||||||
18450CF02BA1B19C009FDF2A /* BreadcrumbsChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = BreadcrumbsChangeLog.txt; sourceTree = "<group>"; };
|
18450CF02BA1B19C009FDF2A /* BreadcrumbsChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = BreadcrumbsChangeLog.txt; sourceTree = "<group>"; };
|
||||||
1855EC652BAABF2A002ACAC2 /* BreadcrumbItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreadcrumbItemModel.swift; sourceTree = "<group>"; };
|
1855EC652BAABF2A002ACAC2 /* BreadcrumbItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreadcrumbItemModel.swift; sourceTree = "<group>"; };
|
||||||
1859B30E2CBF6FDD0031CD70 /* ListUnordered.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListUnordered.swift; sourceTree = "<group>"; };
|
|
||||||
1859B3122CBF70AB0031CD70 /* ListUnordered.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = ListUnordered.txt; sourceTree = "<group>"; };
|
|
||||||
1859B31A2CBFA0180031CD70 /* ListUnorderedItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListUnorderedItemModel.swift; sourceTree = "<group>"; };
|
|
||||||
186B2A892B88DA7F001AB71F /* TextAreaChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = TextAreaChangeLog.txt; sourceTree = "<group>"; };
|
186B2A892B88DA7F001AB71F /* TextAreaChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = TextAreaChangeLog.txt; sourceTree = "<group>"; };
|
||||||
186D13CA2BBA8B1500986B53 /* DropdownSelect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropdownSelect.swift; sourceTree = "<group>"; };
|
186D13CA2BBA8B1500986B53 /* DropdownSelect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropdownSelect.swift; sourceTree = "<group>"; };
|
||||||
186D13CE2BBC36EE00986B53 /* DropdownSelectChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = DropdownSelectChangeLog.txt; sourceTree = "<group>"; };
|
186D13CE2BBC36EE00986B53 /* DropdownSelectChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = DropdownSelectChangeLog.txt; sourceTree = "<group>"; };
|
||||||
@ -464,6 +461,8 @@
|
|||||||
EAF7F11528A1475A00B287F5 /* RadioButtonItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioButtonItem.swift; sourceTree = "<group>"; };
|
EAF7F11528A1475A00B287F5 /* RadioButtonItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioButtonItem.swift; sourceTree = "<group>"; };
|
||||||
EAF7F13228A2A16500B287F5 /* AttachmentLabelAttributeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentLabelAttributeModel.swift; sourceTree = "<group>"; };
|
EAF7F13228A2A16500B287F5 /* AttachmentLabelAttributeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentLabelAttributeModel.swift; sourceTree = "<group>"; };
|
||||||
EAF978202A99035B00C2FEA9 /* Enabling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Enabling.swift; sourceTree = "<group>"; };
|
EAF978202A99035B00C2FEA9 /* Enabling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Enabling.swift; sourceTree = "<group>"; };
|
||||||
|
EAFD5A9F2CB5CA5300C87DE1 /* TileletGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TileletGroup.swift; sourceTree = "<group>"; };
|
||||||
|
EAFD5AA12CB5CA7900C87DE1 /* TileletGroupFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TileletGroupFlowLayout.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -513,16 +512,6 @@
|
|||||||
path = PriceLockup;
|
path = PriceLockup;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
1859B30D2CBF6EF80031CD70 /* ListUnordered */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
1859B30E2CBF6FDD0031CD70 /* ListUnordered.swift */,
|
|
||||||
1859B31A2CBFA0180031CD70 /* ListUnorderedItemModel.swift */,
|
|
||||||
1859B3122CBF70AB0031CD70 /* ListUnordered.txt */,
|
|
||||||
);
|
|
||||||
path = ListUnordered;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
186D13C92BBA8A3500986B53 /* DropdownSelect */ = {
|
186D13C92BBA8A3500986B53 /* DropdownSelect */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -774,7 +763,6 @@
|
|||||||
180636C52C29B06200C92D86 /* InputStepper */,
|
180636C52C29B06200C92D86 /* InputStepper */,
|
||||||
EA3362412892EF700071C351 /* Label */,
|
EA3362412892EF700071C351 /* Label */,
|
||||||
44604AD529CE195300E62B51 /* Line */,
|
44604AD529CE195300E62B51 /* Line */,
|
||||||
1859B30D2CBF6EF80031CD70 /* ListUnordered */,
|
|
||||||
EAD0688C2A55F801002E3A2D /* Loader */,
|
EAD0688C2A55F801002E3A2D /* Loader */,
|
||||||
18C0F9442C980CE500E1DD71 /* Modal */,
|
18C0F9442C980CE500E1DD71 /* Modal */,
|
||||||
445BA07629C07ABA0036A7C5 /* Notification */,
|
445BA07629C07ABA0036A7C5 /* Notification */,
|
||||||
@ -973,6 +961,7 @@
|
|||||||
EA5E3056295105930082B959 /* Tilelet */ = {
|
EA5E3056295105930082B959 /* Tilelet */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
EAFD5A9E2CB5C9ED00C87DE1 /* TileletGroup */,
|
||||||
EA5E3057295105A40082B959 /* Tilelet.swift */,
|
EA5E3057295105A40082B959 /* Tilelet.swift */,
|
||||||
EA985BE529688F6A00F2FF2E /* TileletBadgeModel.swift */,
|
EA985BE529688F6A00F2FF2E /* TileletBadgeModel.swift */,
|
||||||
71ACE89D2BA1CC1700FB6ADC /* TiletEyebrowModel.swift */,
|
71ACE89D2BA1CC1700FB6ADC /* TiletEyebrowModel.swift */,
|
||||||
@ -1187,6 +1176,15 @@
|
|||||||
path = RadioButton;
|
path = RadioButton;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
EAFD5A9E2CB5C9ED00C87DE1 /* TileletGroup */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
EAFD5A9F2CB5CA5300C87DE1 /* TileletGroup.swift */,
|
||||||
|
EAFD5AA12CB5CA7900C87DE1 /* TileletGroupFlowLayout.swift */,
|
||||||
|
);
|
||||||
|
path = TileletGroup;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
@ -1363,7 +1361,6 @@
|
|||||||
EA6642952BCEBF9500D81DC4 /* TextLinkModel.swift in Sources */,
|
EA6642952BCEBF9500D81DC4 /* TextLinkModel.swift in Sources */,
|
||||||
71FC86E22B97483000700965 /* Clamping.swift in Sources */,
|
71FC86E22B97483000700965 /* Clamping.swift in Sources */,
|
||||||
EAF7F0B3289B1ADC00B287F5 /* ActionLabelAttribute.swift in Sources */,
|
EAF7F0B3289B1ADC00B287F5 /* ActionLabelAttribute.swift in Sources */,
|
||||||
1859B30F2CBF6FEB0031CD70 /* ListUnordered.swift in Sources */,
|
|
||||||
1855EC662BAABF2A002ACAC2 /* BreadcrumbItemModel.swift in Sources */,
|
1855EC662BAABF2A002ACAC2 /* BreadcrumbItemModel.swift in Sources */,
|
||||||
EAC925832911B35400091998 /* TextLinkCaret.swift in Sources */,
|
EAC925832911B35400091998 /* TextLinkCaret.swift in Sources */,
|
||||||
EA33622E2891EA3C0071C351 /* DispatchQueue+Once.swift in Sources */,
|
EA33622E2891EA3C0071C351 /* DispatchQueue+Once.swift in Sources */,
|
||||||
@ -1399,6 +1396,7 @@
|
|||||||
EAB1D2CD28ABE76100DAE764 /* Withable.swift in Sources */,
|
EAB1D2CD28ABE76100DAE764 /* Withable.swift in Sources */,
|
||||||
71FC86DC2B96F4C800700965 /* PaginationCellItem.swift in Sources */,
|
71FC86DC2B96F4C800700965 /* PaginationCellItem.swift in Sources */,
|
||||||
EAC846F3294B95CE00F685BA /* ButtonGroupCollectionViewCell.swift in Sources */,
|
EAC846F3294B95CE00F685BA /* ButtonGroupCollectionViewCell.swift in Sources */,
|
||||||
|
EAFD5AA02CB5CA5300C87DE1 /* TileletGroup.swift in Sources */,
|
||||||
EAF7F0952899861000B287F5 /* CheckboxItem.swift in Sources */,
|
EAF7F0952899861000B287F5 /* CheckboxItem.swift in Sources */,
|
||||||
EA985BE82968951C00F2FF2E /* TileletTitleModel.swift in Sources */,
|
EA985BE82968951C00F2FF2E /* TileletTitleModel.swift in Sources */,
|
||||||
71FC86DE2B9738B900700965 /* SurfaceConfigurationValue.swift in Sources */,
|
71FC86DE2B9738B900700965 /* SurfaceConfigurationValue.swift in Sources */,
|
||||||
@ -1431,7 +1429,6 @@
|
|||||||
EAD8D2C128BFDE8B006EB6A6 /* UIGestureRecognizer+Publisher.swift in Sources */,
|
EAD8D2C128BFDE8B006EB6A6 /* UIGestureRecognizer+Publisher.swift in Sources */,
|
||||||
18B42AC62C09D197008D6262 /* CarouselSlotAlignmentModel.swift in Sources */,
|
18B42AC62C09D197008D6262 /* CarouselSlotAlignmentModel.swift in Sources */,
|
||||||
71B23C2D2B91FA690027F7D9 /* Pagination.swift in Sources */,
|
71B23C2D2B91FA690027F7D9 /* Pagination.swift in Sources */,
|
||||||
1859B31B2CBFA0180031CD70 /* ListUnorderedItemModel.swift in Sources */,
|
|
||||||
EA0D1C372A681CCE00E5C127 /* ToggleView.swift in Sources */,
|
EA0D1C372A681CCE00E5C127 /* ToggleView.swift in Sources */,
|
||||||
EAF7F0B9289C139800B287F5 /* ColorConfiguration.swift in Sources */,
|
EAF7F0B9289C139800B287F5 /* ColorConfiguration.swift in Sources */,
|
||||||
EA3361BD288B2C760071C351 /* TypeAlias.swift in Sources */,
|
EA3361BD288B2C760071C351 /* TypeAlias.swift in Sources */,
|
||||||
@ -1478,6 +1475,7 @@
|
|||||||
EA336171288B19200071C351 /* VDS.docc in Sources */,
|
EA336171288B19200071C351 /* VDS.docc in Sources */,
|
||||||
EA985BF02968A93600F2FF2E /* TitleLockupEyebrowModel.swift in Sources */,
|
EA985BF02968A93600F2FF2E /* TitleLockupEyebrowModel.swift in Sources */,
|
||||||
EA5E30532950DDA60082B959 /* TitleLockup.swift in Sources */,
|
EA5E30532950DDA60082B959 /* TitleLockup.swift in Sources */,
|
||||||
|
EAFD5AA22CB5CA7900C87DE1 /* TileletGroupFlowLayout.swift in Sources */,
|
||||||
EAD062B02A3B873E0015965D /* BadgeIndicator.swift in Sources */,
|
EAD062B02A3B873E0015965D /* BadgeIndicator.swift in Sources */,
|
||||||
183B16F32C78CF7C00BA6A10 /* CarouselSlotCell.swift in Sources */,
|
183B16F32C78CF7C00BA6A10 /* CarouselSlotCell.swift in Sources */,
|
||||||
44A952DD2BE3DA820009F874 /* TableFlowLayout.swift in Sources */,
|
44A952DD2BE3DA820009F874 /* TableFlowLayout.swift in Sources */,
|
||||||
@ -1671,7 +1669,7 @@
|
|||||||
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 75;
|
CURRENT_PROJECT_VERSION = 74;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
@ -1709,7 +1707,7 @@
|
|||||||
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 75;
|
CURRENT_PROJECT_VERSION = 74;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// Base Class use to build Controls.
|
/// Base Class use to build Controls.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSControl)
|
@objc(VDSControl)
|
||||||
open class Control: UIControl, ViewProtocol, UserInfoable, Clickable {
|
open class Control: UIControl, ViewProtocol, UserInfoable, Clickable {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -28,6 +28,7 @@ public protocol SelectorControlable: Control, Changeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Base Class used to build out a Selector control.
|
/// Base Class used to build out a Selector control.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSSelectorBase)
|
@objc(VDSSelectorBase)
|
||||||
open class SelectorBase: Control, SelectorControlable, ParentViewProtocol {
|
open class SelectorBase: Control, SelectorControlable, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// Base Class used to build Views.
|
/// Base Class used to build Views.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSView)
|
@objc(VDSView)
|
||||||
open class View: UIView, ViewProtocol, UserInfoable, Clickable {
|
open class View: UIView, ViewProtocol, UserInfoable, Clickable {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import Combine
|
import Combine
|
||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSAlertViewController)
|
@objc(VDSAlertViewController)
|
||||||
open class AlertViewController: UIViewController, Surfaceable {
|
open class AlertViewController: UIViewController, Surfaceable {
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSClearPopoverViewController)
|
@objc(VDSClearPopoverViewController)
|
||||||
open class ClearPopoverViewController: UIViewController, UIPopoverPresentationControllerDelegate {
|
open class ClearPopoverViewController: UIViewController, UIPopoverPresentationControllerDelegate {
|
||||||
|
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import Combine
|
|||||||
/// If you are using AutoLayoutConstraints you have a combination of Leading/Left and Trailing/Right NSLayoutConstraints,
|
/// If you are using AutoLayoutConstraints you have a combination of Leading/Left and Trailing/Right NSLayoutConstraints,
|
||||||
/// you need to ensure that one of these Horizontal Contraints is not constraint of "equatTo". If you are to pin the left/right edges
|
/// you need to ensure that one of these Horizontal Contraints is not constraint of "equatTo". If you are to pin the left/right edges
|
||||||
/// to its parent this object will stretch to the parent's width.
|
/// to its parent this object will stretch to the parent's width.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSBadge)
|
@objc(VDSBadge)
|
||||||
open class Badge: View, ParentViewProtocol {
|
open class Badge: View, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// A badge indicator is a visual label used to convey status or highlight supplemental information.
|
/// A badge indicator is a visual label used to convey status or highlight supplemental information.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSBadgeIndicator)
|
@objc(VDSBadgeIndicator)
|
||||||
open class BadgeIndicator: View, ParentViewProtocol {
|
open class BadgeIndicator: View, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import Combine
|
|||||||
/// A Breadcrumb Item contains href(link) and selected flag.
|
/// A Breadcrumb Item contains href(link) and selected flag.
|
||||||
/// Breadcrumb links to its respective page if it is not disabled.
|
/// Breadcrumb links to its respective page if it is not disabled.
|
||||||
/// Breadcrumb contains text with a separator by default, highlights text in bold without a separator if selected.
|
/// Breadcrumb contains text with a separator by default, highlights text in bold without a separator if selected.
|
||||||
|
@objcMembers
|
||||||
@objc (VDSBreadcrumbItem)
|
@objc (VDSBreadcrumbItem)
|
||||||
open class BreadcrumbItem: ButtonBase {
|
open class BreadcrumbItem: ButtonBase {
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import Combine
|
|||||||
/// A Breadcrumbs contains BreadcrumbItems.
|
/// A Breadcrumbs contains BreadcrumbItems.
|
||||||
/// It contains Breadcrumb Item Default, Breadcrumb Item Selected, Separator.
|
/// It contains Breadcrumb Item Default, Breadcrumb Item Selected, Separator.
|
||||||
/// Breadcrumbs are secondary navigation that use a hierarchy of internal links to tell customers where they are in an experience. Each breadcrumb links to its respective page, except for that of current page.
|
/// Breadcrumbs are secondary navigation that use a hierarchy of internal links to tell customers where they are in an experience. Each breadcrumb links to its respective page, except for that of current page.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSBreadcrumbs)
|
@objc(VDSBreadcrumbs)
|
||||||
open class Breadcrumbs: View, ParentViewProtocol {
|
open class Breadcrumbs: View, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import Combine
|
|||||||
/// If you are using AutoLayoutConstraints you have a combination of Leading/Left and Trailing/Right NSLayoutConstraints,
|
/// If you are using AutoLayoutConstraints you have a combination of Leading/Left and Trailing/Right NSLayoutConstraints,
|
||||||
/// you need to ensure that one of these Horizontal Contraints is not constraint of "equatTo". If you are to pin the left/right edges
|
/// you need to ensure that one of these Horizontal Contraints is not constraint of "equatTo". If you are to pin the left/right edges
|
||||||
/// to its parent this object will stretch to the parent's width.
|
/// to its parent this object will stretch to the parent's width.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSButton)
|
@objc(VDSButton)
|
||||||
open class Button: ButtonBase, Useable {
|
open class Button: ButtonBase, Useable {
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// Base class used for UIButton type classes.
|
/// Base class used for UIButton type classes.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSButtonBase)
|
@objc(VDSButtonBase)
|
||||||
open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable {
|
open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable {
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// A button group contains combinations of related CTAs including ``Button``, ``TextLink``, and ``TextLinkCaret``. This group component controls a combination's orientation, spacing, size and allowable size pairings.
|
/// A button group contains combinations of related CTAs including ``Button``, ``TextLink``, and ``TextLinkCaret``. This group component controls a combination's orientation, spacing, size and allowable size pairings.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSButtonGroup)
|
@objc(VDSButtonGroup)
|
||||||
open class ButtonGroup: View {
|
open class ButtonGroup: View {
|
||||||
|
|
||||||
|
|||||||
@ -16,6 +16,7 @@ import Combine
|
|||||||
/// If you are using AutoLayoutConstraints you have a combination of Leading/Left and Trailing/Right NSLayoutConstraints,
|
/// If you are using AutoLayoutConstraints you have a combination of Leading/Left and Trailing/Right NSLayoutConstraints,
|
||||||
/// you need to ensure that one of these Horizontal Contraints is not constraint of "equatTo". If you are to pin the left/right edges
|
/// you need to ensure that one of these Horizontal Contraints is not constraint of "equatTo". If you are to pin the left/right edges
|
||||||
/// to its parent this object will stretch to the parent's width.
|
/// to its parent this object will stretch to the parent's width.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTextLink)
|
@objc(VDSTextLink)
|
||||||
open class TextLink: ButtonBase {
|
open class TextLink: ButtonBase {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -16,6 +16,7 @@ import Combine
|
|||||||
/// If you are using AutoLayoutConstraints you have a combination of Leading/Left and Trailing/Right NSLayoutConstraints,
|
/// If you are using AutoLayoutConstraints you have a combination of Leading/Left and Trailing/Right NSLayoutConstraints,
|
||||||
/// you need to ensure that one of these Horizontal Contraints is not constraint of "equatTo". If you are to pin the left/right edges
|
/// you need to ensure that one of these Horizontal Contraints is not constraint of "equatTo". If you are to pin the left/right edges
|
||||||
/// to its parent this object will stretch to the parent's width.
|
/// to its parent this object will stretch to the parent's width.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTextLinkCaret)
|
@objc(VDSTextLinkCaret)
|
||||||
open class TextLinkCaret: ButtonBase {
|
open class TextLinkCaret: ButtonBase {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// A calendar is a monthly view that lets customers select a single date.
|
/// A calendar is a monthly view that lets customers select a single date.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSCalendar)
|
@objc(VDSCalendar)
|
||||||
open class CalendarBase: Control, Changeable {
|
open class CalendarBase: Control, Changeable {
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import Combine
|
|||||||
|
|
||||||
/// A carousel is a collection of related content in a row that a customer can navigate through horizontally.
|
/// A carousel is a collection of related content in a row that a customer can navigate through horizontally.
|
||||||
/// Use this component to show content that is supplementary, not essential for task completion.
|
/// Use this component to show content that is supplementary, not essential for task completion.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSCarousel)
|
@objc(VDSCarousel)
|
||||||
open class Carousel: View {
|
open class Carousel: View {
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import Combine
|
|||||||
|
|
||||||
/// A carousel scrollbar is a control that allows to navigate between items in a carousel.
|
/// A carousel scrollbar is a control that allows to navigate between items in a carousel.
|
||||||
/// It's also a status indicator that conveys the relative amount of content in a carousel and a location within it.
|
/// It's also a status indicator that conveys the relative amount of content in a carousel and a location within it.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSCarouselScrollbar)
|
@objc(VDSCarouselScrollbar)
|
||||||
open class CarouselScrollbar: View {
|
open class CarouselScrollbar: View {
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import VDSCoreTokens
|
|||||||
|
|
||||||
/// Checkboxes are a multi-select component through which a customer indicates a choice. This is also used within
|
/// Checkboxes are a multi-select component through which a customer indicates a choice. This is also used within
|
||||||
/// ``CheckboxItem`` and ``CheckboxGroup``
|
/// ``CheckboxItem`` and ``CheckboxGroup``
|
||||||
|
@objcMembers
|
||||||
@objc(VDSCheckbox)
|
@objc(VDSCheckbox)
|
||||||
open class Checkbox: SelectorBase {
|
open class Checkbox: SelectorBase {
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import VDSCoreTokens
|
|||||||
/// When the choice has multiple options, use a checkbox group. For example, use a checkbox group when
|
/// When the choice has multiple options, use a checkbox group. For example, use a checkbox group when
|
||||||
/// asking a customer which attributes they would like to filter their search by. This uses ``CheckboxItem``
|
/// asking a customer which attributes they would like to filter their search by. This uses ``CheckboxItem``
|
||||||
/// to allow user selection.
|
/// to allow user selection.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSCheckboxGroup)
|
@objc(VDSCheckboxGroup)
|
||||||
open class CheckboxGroup: SelectorGroupBase<CheckboxItem>, SelectorGroupMultiSelect {
|
open class CheckboxGroup: SelectorGroupBase<CheckboxItem>, SelectorGroupMultiSelect {
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import Foundation
|
|||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
/// Checkboxes are a multi-select component through which a customer indicates a choice. If a binary choice, the component is a checkbox. If the choice has multiple options, the component is a ``CheckboxGroup``.
|
/// Checkboxes are a multi-select component through which a customer indicates a choice. If a binary choice, the component is a checkbox. If the choice has multiple options, the component is a ``CheckboxGroup``.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSCheckboxItem)
|
@objc(VDSCheckboxItem)
|
||||||
open class CheckboxItem: SelectorItemBase<Checkbox> {
|
open class CheckboxItem: SelectorItemBase<Checkbox> {
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// A dropdown select is an expandable menu of predefined options that allows a customer to make a single selection.
|
/// A dropdown select is an expandable menu of predefined options that allows a customer to make a single selection.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSDatePicker)
|
@objc(VDSDatePicker)
|
||||||
open class DatePicker: EntryFieldBase<String> {
|
open class DatePicker: EntryFieldBase<String> {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// A dropdown select is an expandable menu of predefined options that allows a customer to make a single selection.
|
/// A dropdown select is an expandable menu of predefined options that allows a customer to make a single selection.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSDropdownSelect)
|
@objc(VDSDropdownSelect)
|
||||||
open class DropdownSelect: EntryFieldBase<String> {
|
open class DropdownSelect: EntryFieldBase<String> {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
/// This must always be paired with one or more ``Footnote`` in a FootnoteGroup.
|
/// This must always be paired with one or more ``Footnote`` in a FootnoteGroup.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSFootnoteGroup)
|
@objc(VDSFootnoteGroup)
|
||||||
open class FootnoteGroup: View {
|
open class FootnoteGroup: View {
|
||||||
|
|
||||||
@ -110,12 +111,6 @@ open class FootnoteGroup: View {
|
|||||||
width = nil
|
width = nil
|
||||||
footnoteItems = []
|
footnoteItems = []
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Used to make changes to the View based off a change events or from local properties.
|
|
||||||
open override func updateView() {
|
|
||||||
super.updateView()
|
|
||||||
updateFootnoteItems()
|
|
||||||
}
|
|
||||||
|
|
||||||
internal func updateFootnoteItems() {
|
internal func updateFootnoteItems() {
|
||||||
// symbol containers are as wide as the widest symbol container in the group.
|
// symbol containers are as wide as the widest symbol container in the group.
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
|
|
||||||
/// A footnote is text that provides supporting details, legal copy and links to related content.
|
/// A footnote is text that provides supporting details, legal copy and links to related content.
|
||||||
/// It exists at the bottom or "foot" of a page or section.
|
/// It exists at the bottom or "foot" of a page or section.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSFootnoteItem)
|
@objc(VDSFootnoteItem)
|
||||||
open class FootnoteItem: View {
|
open class FootnoteItem: View {
|
||||||
|
|
||||||
@ -206,7 +207,7 @@ open class FootnoteItem: View {
|
|||||||
|
|
||||||
// Update symbolLabel
|
// Update symbolLabel
|
||||||
symbolLabel.text = symbolType
|
symbolLabel.text = symbolType
|
||||||
symbolLabel.isHidden = symbolType.isEmpty ? true : hideSymbol
|
symbolLabel.isHidden = hideSymbol
|
||||||
symbolLabel.textColor = kind.colorConfiguration.getColor(self)
|
symbolLabel.textColor = kind.colorConfiguration.getColor(self)
|
||||||
symbolLabel.textStyle = size.textStyle.regular
|
symbolLabel.textStyle = size.textStyle.regular
|
||||||
symbolLabel.surface = surface
|
symbolLabel.surface = surface
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import Combine
|
|||||||
/// An icon is a graphical element that conveys information at a glance. It helps orient
|
/// An icon is a graphical element that conveys information at a glance. It helps orient
|
||||||
/// a customer, explain functionality and draw attention to interactive elements. Icons
|
/// a customer, explain functionality and draw attention to interactive elements. Icons
|
||||||
/// should have a functional purpose and should never be used for decoration.
|
/// should have a functional purpose and should never be used for decoration.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSIcon)
|
@objc(VDSIcon)
|
||||||
open class Icon: View {
|
open class Icon: View {
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// A stepper is a two-segment control that people use to increase or decrease an incremental value.'
|
/// A stepper is a two-segment control that people use to increase or decrease an incremental value.'
|
||||||
|
@objcMembers
|
||||||
@objc(VDSInputStepper)
|
@objc(VDSInputStepper)
|
||||||
open class InputStepper: EntryFieldBase<Int> {
|
open class InputStepper: EntryFieldBase<Int> {
|
||||||
|
|
||||||
|
|||||||
@ -39,27 +39,6 @@ public extension String {
|
|||||||
func isValid(range: NSRange) -> Bool {
|
func isValid(range: NSRange) -> Bool {
|
||||||
range.location >= 0 && range.length > 0 && range.location + range.length <= count
|
range.location >= 0 && range.length > 0 && range.location + range.length <= count
|
||||||
}
|
}
|
||||||
|
|
||||||
func index(from: Int) -> Index {
|
|
||||||
return self.index(startIndex, offsetBy: from)
|
|
||||||
}
|
|
||||||
|
|
||||||
func substring(from: Int) -> String {
|
|
||||||
let fromIndex = index(from: from)
|
|
||||||
return String(self[fromIndex...])
|
|
||||||
}
|
|
||||||
|
|
||||||
func substring(to: Int) -> String {
|
|
||||||
let toIndex = index(from: to)
|
|
||||||
return String(self[..<toIndex])
|
|
||||||
}
|
|
||||||
|
|
||||||
func substring(with r: Range<Int>) -> String {
|
|
||||||
let startIndex = index(from: r.lowerBound)
|
|
||||||
let endIndex = index(from: r.upperBound)
|
|
||||||
return String(self[startIndex..<endIndex])
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension NSAttributedString {
|
public extension NSAttributedString {
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import Combine
|
|||||||
|
|
||||||
/// Label is a standard view used to draw text with applying Typography through ``TextStyle`` as well
|
/// Label is a standard view used to draw text with applying Typography through ``TextStyle`` as well
|
||||||
/// as other attributes using any implemetation of ``LabelAttributeModel``.
|
/// as other attributes using any implemetation of ``LabelAttributeModel``.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSLabel)
|
@objc(VDSLabel)
|
||||||
open class Label: UILabel, ViewProtocol, UserInfoable {
|
open class Label: UILabel, ViewProtocol, UserInfoable {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
/// A line visually separates content sections or elements in lists, tables and layouts to indicate content hierarchy.
|
/// A line visually separates content sections or elements in lists, tables and layouts to indicate content hierarchy.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSLine)
|
@objc(VDSLine)
|
||||||
open class Line: View {
|
open class Line: View {
|
||||||
|
|
||||||
|
|||||||
@ -1,239 +0,0 @@
|
|||||||
//
|
|
||||||
// ListUnordered.swift
|
|
||||||
// VDS
|
|
||||||
//
|
|
||||||
// Created by Vasavi Kanamarlapudi on 16/10/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
import UIKit
|
|
||||||
import VDSCoreTokens
|
|
||||||
|
|
||||||
/// List unordered breaks up related content into distinct phrases or sentences, which improves scannability.
|
|
||||||
/// This component should be used when the text items don’t need to be in numeric order.
|
|
||||||
@objcMembers
|
|
||||||
@objc(VDSListUnordered)
|
|
||||||
open class ListUnordered: View {
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Enums
|
|
||||||
//--------------------------------------------------
|
|
||||||
/// Enum that represents the size availble for the component.
|
|
||||||
public enum Size: String, DefaultValuing, CaseIterable {
|
|
||||||
case large
|
|
||||||
case medium
|
|
||||||
case small
|
|
||||||
case micro
|
|
||||||
|
|
||||||
public static var defaultValue: Self { .large }
|
|
||||||
|
|
||||||
/// TextStyle relative to Size.
|
|
||||||
public var textStyle: TextStyle.StandardStyle {
|
|
||||||
switch self {
|
|
||||||
case .large:
|
|
||||||
return .bodyLarge
|
|
||||||
case .medium:
|
|
||||||
return .bodyMedium
|
|
||||||
case .small:
|
|
||||||
return .bodySmall
|
|
||||||
case .micro:
|
|
||||||
return .micro
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Enum that represents the type of spacing available for the component.
|
|
||||||
public enum Spacing: String, CaseIterable {
|
|
||||||
case standard, compact
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Public Properties
|
|
||||||
//--------------------------------------------------
|
|
||||||
/// Size of the component. The default size is Large.
|
|
||||||
open var size: Size = .defaultValue { didSet { setNeedsUpdate() } }
|
|
||||||
|
|
||||||
/// Spacing type of the component.
|
|
||||||
open var spacing: Spacing = .standard { didSet { setNeedsUpdate() } }
|
|
||||||
|
|
||||||
/// Lead-in text that shows as the top text for the component. This is optional.
|
|
||||||
open var leadInText: String? = nil { didSet { setNeedsUpdate() } }
|
|
||||||
|
|
||||||
/// Array of unordered list items to show for the component.
|
|
||||||
open var unorderedList: [ListUnorderedItemModel] = [] { didSet { setNeedsUpdate() }}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Configuration Properties
|
|
||||||
//--------------------------------------------------
|
|
||||||
// It can be used for Glyph level 1.
|
|
||||||
private var disc = "•"
|
|
||||||
|
|
||||||
// It can be used for Glyph Level 2.
|
|
||||||
private var endash = "–"
|
|
||||||
|
|
||||||
// Spacing between the list items.
|
|
||||||
private var spaceBetweenItems: CGFloat {
|
|
||||||
switch (size, spacing) {
|
|
||||||
case (.large, .standard):
|
|
||||||
return VDSLayout.space4X
|
|
||||||
case (.medium, .standard), (.small, .standard), (.micro, .standard):
|
|
||||||
return VDSLayout.space3X
|
|
||||||
case (.large, .compact):
|
|
||||||
return VDSLayout.space2X
|
|
||||||
case (.medium, .compact), (.small, .compact), (.micro, .compact):
|
|
||||||
return VDSLayout.space1X
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Padding that can be used in an item between the glyph and the item text.
|
|
||||||
private var padding: CGFloat {
|
|
||||||
switch (size, spacing) {
|
|
||||||
case (.large, .standard), (.large, .compact):
|
|
||||||
return VDSLayout.space3X
|
|
||||||
case (.medium, .standard), (.small, .standard), (.micro, .standard), (.medium, .compact), (.small, .compact), (.micro, .compact):
|
|
||||||
return VDSLayout.space2X
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private let textColorConfiguration = SurfaceColorConfiguration(VDSColor.elementsPrimaryOnlight, VDSColor.elementsPrimaryOndark)
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Private Properties
|
|
||||||
//--------------------------------------------------
|
|
||||||
private lazy var listStackView = UIStackView().with {
|
|
||||||
$0.translatesAutoresizingMaskIntoConstraints = false
|
|
||||||
$0.axis = .vertical
|
|
||||||
$0.distribution = .fill
|
|
||||||
$0.spacing = spaceBetweenItems
|
|
||||||
$0.backgroundColor = .clear
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Overrides
|
|
||||||
//--------------------------------------------------
|
|
||||||
/// Called once when a view is initialized and is used to Setup additional UI or other constants and config.texturations.
|
|
||||||
open override func setup() {
|
|
||||||
super.setup()
|
|
||||||
|
|
||||||
// add stackview
|
|
||||||
addSubview(listStackView)
|
|
||||||
listStackView.heightGreaterThanEqualTo(constant:0)
|
|
||||||
listStackView.pinToSuperView()
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func setDefaults() {
|
|
||||||
super.setDefaults()
|
|
||||||
leadInText = nil
|
|
||||||
unorderedList = []
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Resets to default settings.
|
|
||||||
open override func reset() {
|
|
||||||
super.reset()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Used to make changes to the View based off a change events or from local properties.
|
|
||||||
open override func updateView() {
|
|
||||||
super.updateView()
|
|
||||||
listStackView.removeArrangedSubviews()
|
|
||||||
listStackView.subviews.forEach { $0.removeFromSuperview() }
|
|
||||||
listStackView.spacing = spaceBetweenItems
|
|
||||||
|
|
||||||
if leadInText != nil {
|
|
||||||
let listItem = getListItem(with:self.leadInText, surface: surface)
|
|
||||||
listStackView.addArrangedSubview(listItem)
|
|
||||||
}
|
|
||||||
|
|
||||||
unorderedList.forEach { item in
|
|
||||||
let listItem = getListItem(levelOneText: item.levelOneText, surface: surface)
|
|
||||||
listStackView.addArrangedSubview(listItem)
|
|
||||||
|
|
||||||
item.levelTwoText?.forEach { text in
|
|
||||||
let listItem = getListItem(levelTwoText: text, surface: surface)
|
|
||||||
listStackView.addArrangedSubview(listItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Private Methods
|
|
||||||
//--------------------------------------------------
|
|
||||||
// Get Label with the required text and text formats.
|
|
||||||
func getLabel(with text: String?, surface: Surface) -> Label {
|
|
||||||
let textLabel = Label().with {
|
|
||||||
$0.isAccessibilityElement = true
|
|
||||||
$0.lineBreakMode = .byWordWrapping
|
|
||||||
$0.text = text
|
|
||||||
$0.textStyle = size.textStyle.regular
|
|
||||||
$0.textColor = textColorConfiguration.getColor(surface)
|
|
||||||
$0.surface = surface
|
|
||||||
}
|
|
||||||
return textLabel
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the list item with the required text (LeadInText, Level 1 Text, Level 2 Text).
|
|
||||||
func getListItem(with leadInText:String? = nil, levelOneText: String? = nil, levelTwoText: String? = nil, surface:Surface) -> UIView {
|
|
||||||
let itemStackView = UIStackView().with {
|
|
||||||
$0.translatesAutoresizingMaskIntoConstraints = false
|
|
||||||
$0.axis = .horizontal
|
|
||||||
$0.alignment = .leading
|
|
||||||
$0.distribution = .fill
|
|
||||||
$0.spacing = padding
|
|
||||||
$0.backgroundColor = .clear
|
|
||||||
}
|
|
||||||
|
|
||||||
// StackView with LeadIntext if provided.
|
|
||||||
if leadInText != nil {
|
|
||||||
let leadTextLabel = getLabel(with: leadInText, surface: surface)
|
|
||||||
itemStackView.addArrangedSubview(leadTextLabel)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StackView with Level 1 Text if provided.
|
|
||||||
if levelOneText != nil {
|
|
||||||
|
|
||||||
// Add level 1 glyph: 'disc, bold'
|
|
||||||
let discLabel = getLabel(with: disc, surface: surface)
|
|
||||||
discLabel.widthAnchor.constraint(equalToConstant: discLabel.intrinsicContentSize.width).activate()
|
|
||||||
itemStackView.addArrangedSubview(discLabel)
|
|
||||||
|
|
||||||
// Add level 1 Text
|
|
||||||
let levelOneLabel = getLabel(with: levelOneText, surface: surface)
|
|
||||||
itemStackView.addArrangedSubview(levelOneLabel)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StackView with Level 2 Text if provided.
|
|
||||||
if levelTwoText != nil {
|
|
||||||
|
|
||||||
// Set level 2 leading space as needed for alignment.
|
|
||||||
let discSpaceView = View()
|
|
||||||
let discLabel = getLabel(with: disc, surface: surface)
|
|
||||||
discSpaceView.widthAnchor.constraint(equalToConstant: discLabel.intrinsicContentSize.width).activate()
|
|
||||||
itemStackView.addArrangedSubview(discSpaceView)
|
|
||||||
|
|
||||||
// Add level 2 glyph: 'en dash, regular'
|
|
||||||
let endashLabel = getLabel(with: endash, surface: surface)
|
|
||||||
endashLabel.widthAnchor.constraint(equalToConstant: endashLabel.intrinsicContentSize.width).activate()
|
|
||||||
itemStackView.addArrangedSubview(endashLabel)
|
|
||||||
|
|
||||||
// Add level 2 Text
|
|
||||||
let levelTwoLabel = getLabel(with: levelTwoText, surface: surface)
|
|
||||||
itemStackView.addArrangedSubview(levelTwoLabel)
|
|
||||||
}
|
|
||||||
return itemStackView
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
MM/DD/YYYY
|
|
||||||
----------------
|
|
||||||
- Initial Brand 3.0 handoff
|
|
||||||
|
|
||||||
05/2/2022
|
|
||||||
----------------
|
|
||||||
- Added Body Medium to size configuration
|
|
||||||
|
|
||||||
05/5/2022
|
|
||||||
----------------
|
|
||||||
- Added Spacing configuration (Standard, Compact) Web handoff
|
|
||||||
|
|
||||||
08/2/2022
|
|
||||||
----------------
|
|
||||||
- Included a VDS Note about the Spacing prop naming rationale
|
|
||||||
|
|
||||||
08/10/2022
|
|
||||||
----------------
|
|
||||||
- Updated default and inverted prop to light and dark surface.
|
|
||||||
|
|
||||||
12/13/2022
|
|
||||||
----------------
|
|
||||||
- Replaced focus border pixel and style & spacing values with tokens.
|
|
||||||
|
|
||||||
01/10/2023
|
|
||||||
----------------
|
|
||||||
- Removed from Anatomy section: “List item text”
|
|
||||||
- Updated “Glyph level 1” to “List Item Level 1”
|
|
||||||
- Updated “Glyph level 2” to “List Item Level 2”
|
|
||||||
- Updated image markers to reflect changes
|
|
||||||
|
|
||||||
02/02/2023
|
|
||||||
----------------
|
|
||||||
- Reduced left padding for all Level 2 sizes so that the Glyph aligns with the text in Level 1.
|
|
||||||
- Added dashed line on all sizes to indicate Level 2 alignment under Level 1.
|
|
||||||
- Changed “endash” to “endash, regular” under Size section.
|
|
||||||
- Updated all Level 1 and Level 2 glyph widths to “Hug”
|
|
||||||
|
|
||||||
12/26/23
|
|
||||||
----------------
|
|
||||||
- Deleted Decisions log
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
//
|
|
||||||
// ListUnorderedItemModel.swift
|
|
||||||
// VDS
|
|
||||||
//
|
|
||||||
// Created by Vasavi Kanamarlapudi on 16/10/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
extension ListUnordered {
|
|
||||||
public struct ListUnorderedItemModel: Equatable {
|
|
||||||
|
|
||||||
/// Item Level 1 that shows text with glyph - disc, bold.
|
|
||||||
public var levelOneText: String
|
|
||||||
|
|
||||||
/// Item Level 2 that shows text (one or many) with glyph - en dash. This is optional.
|
|
||||||
public var levelTwoText: [String?]?
|
|
||||||
|
|
||||||
public init(itemLevelOneText: String, itemLevelTwoTexts: [String?]? = nil) {
|
|
||||||
self.levelOneText = itemLevelOneText
|
|
||||||
self.levelTwoText = itemLevelTwoTexts
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
|
|
||||||
|
|
||||||
/// A loader is an indicator that uses animation to show customers that there is an indefinite amount of wait time while a task is ongoing, e.g. a page is loading, a form is being submitted. The component disappears when the task is complete.
|
/// A loader is an indicator that uses animation to show customers that there is an indefinite amount of wait time while a task is ongoing, e.g. a page is loading, a form is being submitted. The component disappears when the task is complete.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSLoader)
|
@objc(VDSLoader)
|
||||||
open class Loader: View {
|
open class Loader: View {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
/// ViewController to show the Loader, this will be presented using the LoaderLaunchable Protocl.
|
/// ViewController to show the Loader, this will be presented using the LoaderLaunchable Protocl.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSLoaderViewController)
|
@objc(VDSLoaderViewController)
|
||||||
open class LoaderViewController: UIViewController, Surfaceable {
|
open class LoaderViewController: UIViewController, Surfaceable {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import Combine
|
|||||||
|
|
||||||
/// A Modal is an overlay that interrupts the user flow to force the customer to provide information or a response.
|
/// A Modal is an overlay that interrupts the user flow to force the customer to provide information or a response.
|
||||||
/// After the customer interacts with the modal, they can return to the parent content.
|
/// After the customer interacts with the modal, they can return to the parent content.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSModal)
|
@objc(VDSModal)
|
||||||
open class Modal: Control, ModalLaunchable {
|
open class Modal: Control, ModalLaunchable {
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import Foundation
|
|||||||
import UIKit
|
import UIKit
|
||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSModalDialog)
|
@objc(VDSModalDialog)
|
||||||
open class ModalDialog: View, UIScrollViewDelegate, ParentViewProtocol {
|
open class ModalDialog: View, UIScrollViewDelegate, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import Combine
|
import Combine
|
||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSModalDialogViewController)
|
@objc(VDSModalDialogViewController)
|
||||||
open class ModalDialogViewController: UIViewController, Surfaceable {
|
open class ModalDialogViewController: UIViewController, Surfaceable {
|
||||||
|
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import Combine
|
|||||||
/// in context. There are four types: information, success, warning and error; each
|
/// in context. There are four types: information, success, warning and error; each
|
||||||
/// with different color and content. They may be screen-specific, flow-specific or
|
/// with different color and content. They may be screen-specific, flow-specific or
|
||||||
/// experience-wide.
|
/// experience-wide.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSNotification)
|
@objc(VDSNotification)
|
||||||
open class Notification: View, ParentViewProtocol {
|
open class Notification: View, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
///Pagination is a control that enables customers to navigate multiple pages of content by selecting either a specific page or the next or previous set of four pages.
|
///Pagination is a control that enables customers to navigate multiple pages of content by selecting either a specific page or the next or previous set of four pages.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSPagination)
|
@objc(VDSPagination)
|
||||||
open class Pagination: View {
|
open class Pagination: View {
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import UIKit
|
|||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
///This is customised button for Pagination view
|
///This is customised button for Pagination view
|
||||||
|
@objcMembers
|
||||||
@objc(PaginationButton)
|
@objc(PaginationButton)
|
||||||
open class PaginationButton: ButtonBase {
|
open class PaginationButton: ButtonBase {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import Foundation
|
|||||||
import UIKit
|
import UIKit
|
||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSPriceLockup)
|
@objc(VDSPriceLockup)
|
||||||
open class PriceLockup: View, ParentViewProtocol {
|
open class PriceLockup: View, ParentViewProtocol {
|
||||||
|
|
||||||
@ -139,7 +140,6 @@ open class PriceLockup: View, ParentViewProtocol {
|
|||||||
internal var delimiterIndex = 0
|
internal var delimiterIndex = 0
|
||||||
internal var strikethroughLocation = 0
|
internal var strikethroughLocation = 0
|
||||||
internal var strikethroughLength = 0
|
internal var strikethroughLength = 0
|
||||||
internal var strikethroughAccessibilityText: String = "price not offering anymore"
|
|
||||||
|
|
||||||
internal var textPosition:TextPosition = .preDelimiter
|
internal var textPosition:TextPosition = .preDelimiter
|
||||||
enum TextPosition: String, CaseIterable {
|
enum TextPosition: String, CaseIterable {
|
||||||
@ -217,24 +217,6 @@ open class PriceLockup: View, ParentViewProtocol {
|
|||||||
|
|
||||||
open override func setDefaults() {
|
open override func setDefaults() {
|
||||||
super.setDefaults()
|
super.setDefaults()
|
||||||
|
|
||||||
priceLockupLabel.bridge_accessibilityLabelBlock = { [weak self] in
|
|
||||||
guard let self else { return "" }
|
|
||||||
var accessibilityLabels = [String]()
|
|
||||||
if let text = priceLockupLabel.text, !text.isEmpty {
|
|
||||||
if strikethrough, strikethroughLength > 0 {
|
|
||||||
let preText = text.substring(to: strikethroughLocation)
|
|
||||||
let postText = text.substring(from: strikethroughLocation)
|
|
||||||
accessibilityLabels.append(preText)
|
|
||||||
accessibilityLabels.append(strikethroughAccessibilityText)
|
|
||||||
accessibilityLabels.append(postText)
|
|
||||||
} else {
|
|
||||||
accessibilityLabels.append(text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return accessibilityLabels.joined(separator: " ")
|
|
||||||
}
|
|
||||||
|
|
||||||
bold = false
|
bold = false
|
||||||
hideCurrency = false
|
hideCurrency = false
|
||||||
leadingText = nil
|
leadingText = nil
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import UIKit
|
|||||||
/// Radio boxes are single-select components through which a customer indicates a choice.
|
/// Radio boxes are single-select components through which a customer indicates a choice.
|
||||||
/// They're stylized ``RadioButtons`` that must always be paired with one or more ``RadioBoxItem``
|
/// They're stylized ``RadioButtons`` that must always be paired with one or more ``RadioBoxItem``
|
||||||
/// in a radio box group. Use radio boxes to display choices like device storage.
|
/// in a radio box group. Use radio boxes to display choices like device storage.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSRadioBoxGroup)
|
@objc(VDSRadioBoxGroup)
|
||||||
open class RadioBoxGroup: SelectorGroupBase<RadioBoxItem>, SelectorGroupSingleSelect {
|
open class RadioBoxGroup: SelectorGroupBase<RadioBoxItem>, SelectorGroupSingleSelect {
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import VDSCoreTokens
|
|||||||
|
|
||||||
/// Radio boxes are single-select components through which a customer indicates a choice
|
/// Radio boxes are single-select components through which a customer indicates a choice
|
||||||
/// that are used within a ``RadioBoxGroup``.
|
/// that are used within a ``RadioBoxGroup``.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSRadioBoxItem)
|
@objc(VDSRadioBoxItem)
|
||||||
open class RadioBoxItem: Control, Changeable, FormFieldable, Groupable, ParentViewProtocol {
|
open class RadioBoxItem: Control, Changeable, FormFieldable, Groupable, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import VDSCoreTokens
|
|||||||
/// Radio buttons are single-select components through which a customer indicates a choice.
|
/// Radio buttons are single-select components through which a customer indicates a choice.
|
||||||
/// They must always be paired with one or more ``RadioButtonItem`` within a ``RadioButtonGroup``.
|
/// They must always be paired with one or more ``RadioButtonItem`` within a ``RadioButtonGroup``.
|
||||||
/// Use radio buttons to display choices like delivery method.
|
/// Use radio buttons to display choices like delivery method.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSRadioButton)
|
@objc(VDSRadioButton)
|
||||||
open class RadioButton: SelectorBase {
|
open class RadioButton: SelectorBase {
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import UIKit
|
|||||||
/// Radio buttons items are single-select components through which a customer indicates a choice.
|
/// Radio buttons items are single-select components through which a customer indicates a choice.
|
||||||
/// They must always be paired with one or more other ``RadioButtonItem`` within a radio button group.
|
/// They must always be paired with one or more other ``RadioButtonItem`` within a radio button group.
|
||||||
/// Use radio buttons to display choices like delivery method.
|
/// Use radio buttons to display choices like delivery method.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSRadioButtonGroup)
|
@objc(VDSRadioButtonGroup)
|
||||||
open class RadioButtonGroup: SelectorGroupBase<RadioButtonItem>, SelectorGroupSingleSelect {
|
open class RadioButtonGroup: SelectorGroupBase<RadioButtonItem>, SelectorGroupSingleSelect {
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import UIKit
|
|||||||
/// Radio buttons items are single-select components through which a customer indicates a choice.
|
/// Radio buttons items are single-select components through which a customer indicates a choice.
|
||||||
/// They must always be paired with one or more other radio button items within a ``RadioButtonGroup``.
|
/// They must always be paired with one or more other radio button items within a ``RadioButtonGroup``.
|
||||||
/// Use radio buttons to display choices like delivery method.
|
/// Use radio buttons to display choices like delivery method.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSRadioButtonItem)
|
@objc(VDSRadioButtonItem)
|
||||||
open class RadioButtonItem: SelectorItemBase<RadioButton> {
|
open class RadioButtonItem: SelectorItemBase<RadioButton> {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
///Table is view composed of rows and columns, which takes any view into each cell and resizes based on the highest cell height.
|
///Table is view composed of rows and columns, which takes any view into each cell and resizes based on the highest cell height.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTable)
|
@objc(VDSTable)
|
||||||
open class Table: View {
|
open class Table: View {
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,8 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
extension Tabs {
|
extension Tabs {
|
||||||
@objc(VDSTab)
|
@objcMembers
|
||||||
|
@objc(VDSTab)
|
||||||
open class Tab: Control, Groupable {
|
open class Tab: Control, Groupable {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
/// Tabs are organizational components that group content and allow customers to navigate its display. Use them to separate content when the content is related but doesn’t need to be compared.
|
/// Tabs are organizational components that group content and allow customers to navigate its display. Use them to separate content when the content is related but doesn’t need to be compared.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTabs)
|
@objc(VDSTabs)
|
||||||
open class Tabs: View, ParentViewProtocol {
|
open class Tabs: View, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTabsContainer)
|
@objc(VDSTabsContainer)
|
||||||
open class TabsContainer: View {
|
open class TabsContainer: View {
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import Combine
|
|||||||
/// An input field is an input wherein a customer enters information. They typically appear in forms.
|
/// An input field is an input wherein a customer enters information. They typically appear in forms.
|
||||||
/// Specialized input fields capture credit card numbers, inline actions, passwords, phone numbers,
|
/// Specialized input fields capture credit card numbers, inline actions, passwords, phone numbers,
|
||||||
/// dates and security codes in their correct formats.
|
/// dates and security codes in their correct formats.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSInputField)
|
@objc(VDSInputField)
|
||||||
open class InputField: EntryFieldBase<String> {
|
open class InputField: EntryFieldBase<String> {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import Combine
|
import Combine
|
||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTextField)
|
@objc(VDSTextField)
|
||||||
open class TextField: UITextField, ViewProtocol, Errorable {
|
open class TextField: UITextField, ViewProtocol, Errorable {
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import Combine
|
|||||||
|
|
||||||
/// A text area is an input wherein a customer enters long-form information.
|
/// A text area is an input wherein a customer enters long-form information.
|
||||||
/// Use a text area when you want customers to enter text that’s longer than a single line.
|
/// Use a text area when you want customers to enter text that’s longer than a single line.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTextArea)
|
@objc(VDSTextArea)
|
||||||
open class TextArea: EntryFieldBase<String> {
|
open class TextArea: EntryFieldBase<String> {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import Combine
|
import Combine
|
||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTextView)
|
@objc(VDSTextView)
|
||||||
open class TextView: UITextView, ViewProtocol, Errorable {
|
open class TextView: UITextView, ViewProtocol, Errorable {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import VDSCoreTokens
|
|||||||
import UIKit
|
import UIKit
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTileContainer)
|
@objc(VDSTileContainer)
|
||||||
open class TileContainer: TileContainerBase<TileContainer.Padding> {
|
open class TileContainer: TileContainerBase<TileContainer.Padding> {
|
||||||
|
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import Combine
|
|||||||
/// support quick scanning and engagement. A Tilelet is fully clickable and
|
/// support quick scanning and engagement. A Tilelet is fully clickable and
|
||||||
/// while it can include an arrow CTA, it does not require one in order to
|
/// while it can include an arrow CTA, it does not require one in order to
|
||||||
/// function.
|
/// function.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTilelet)
|
@objc(VDSTilelet)
|
||||||
open class Tilelet: TileContainerBase<Tilelet.Padding>, ParentViewProtocol {
|
open class Tilelet: TileContainerBase<Tilelet.Padding>, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
187
VDS/Components/Tilelet/TileletGroup/TileletGroup.swift
Normal file
187
VDS/Components/Tilelet/TileletGroup/TileletGroup.swift
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
//
|
||||||
|
// TileletGroup.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 10/8/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import UIKit
|
||||||
|
import VDSCoreTokens
|
||||||
|
import Combine
|
||||||
|
|
||||||
|
open class TileletGroup: View {
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Private Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// CollectionView to show the rows and columns
|
||||||
|
private lazy var matrixView = SelfSizingCollectionView(frame: .zero, collectionViewLayout: flowLayout).with {
|
||||||
|
$0.register(TileletGroupCellItem.self, forCellWithReuseIdentifier: TileletGroupCellItem.Identifier)
|
||||||
|
$0.dataSource = self
|
||||||
|
$0.delegate = self
|
||||||
|
$0.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
$0.allowsSelection = false
|
||||||
|
$0.showsVerticalScrollIndicator = false
|
||||||
|
$0.showsHorizontalScrollIndicator = false
|
||||||
|
$0.isAccessibilityElement = true
|
||||||
|
$0.backgroundColor = .clear
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Custom flow layout to manage the height of the cells
|
||||||
|
private lazy var flowLayout = TileletGroupFlowLayout().with {
|
||||||
|
$0.delegate = self
|
||||||
|
$0.scrollDirection = .horizontal
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parameter to show the all table rows
|
||||||
|
private var rows: [[Tilelet]] = [] { didSet { setNeedsUpdate() } }
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Enums
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Enums used to define the padding for the cell edge spacing.
|
||||||
|
public enum Padding: String, CaseIterable {
|
||||||
|
case standard, compact
|
||||||
|
|
||||||
|
var value: CGFloat {
|
||||||
|
switch self {
|
||||||
|
case .standard:
|
||||||
|
return UIDevice.isIPad ? 40.0 : VDSLayout.space3X
|
||||||
|
case .compact:
|
||||||
|
return UIDevice.isIPad ? VDSLayout.space6X : VDSLayout.space3X
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func horizontalValue() -> CGFloat { value }
|
||||||
|
|
||||||
|
func verticalValue() -> CGFloat { value }
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Public Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
/// Parameter to set the padding for the cell
|
||||||
|
open var padding: Padding = .standard { didSet { setNeedsUpdate() } }
|
||||||
|
|
||||||
|
/// An object containing number of Button components per row for iPhones
|
||||||
|
open var rowQuantityPhone: Int = 2 { didSet { updateRows() } }
|
||||||
|
|
||||||
|
/// An object containing number of Button components per row for iPads
|
||||||
|
open var rowQuantityTablet: Int = 4 { didSet { updateRows() } }
|
||||||
|
|
||||||
|
/// An object containing number of Button components per row
|
||||||
|
open var rowQuantity: Int { UIDevice.isIPad ? min(rowQuantityTablet,6) : min(rowQuantityPhone, 3) }
|
||||||
|
|
||||||
|
open var tilelets: [Tilelet] = [] { didSet { updateRows() } }
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Overrides
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
///Called upon initializing the table view
|
||||||
|
open override func setup() {
|
||||||
|
super.setup()
|
||||||
|
addSubview(matrixView)
|
||||||
|
matrixView.pinToSuperView()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Will update the table view, when called becasue of any changes in component parameters
|
||||||
|
open override func updateView() {
|
||||||
|
super.updateView()
|
||||||
|
flowLayout.verticalPadding = padding.verticalValue()
|
||||||
|
flowLayout.horizontalPadding = padding.horizontalValue()
|
||||||
|
matrixView.reloadData()
|
||||||
|
matrixView.collectionViewLayout.invalidateLayout()
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func setDefaults() {
|
||||||
|
super.setDefaults()
|
||||||
|
padding = .standard
|
||||||
|
rows = [[]]
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateRows() {
|
||||||
|
var tempRows: [[Tilelet]] = []
|
||||||
|
for i in stride(from: 0, to: tilelets.count, by: rowQuantity) {
|
||||||
|
let endIndex = min(i + rowQuantity, tilelets.count)
|
||||||
|
let row = Array(tilelets[i..<endIndex])
|
||||||
|
tempRows.append(row)
|
||||||
|
}
|
||||||
|
rows = tempRows
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension TileletGroup: UICollectionViewDelegate, UICollectionViewDataSource, TiletGroupCollectionViewLayoutDataDelegate {
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - UICollectionViewDelegate & UICollectionViewDataSource
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public func numberOfSections(in collectionView: UICollectionView) -> Int {
|
||||||
|
return rows.count
|
||||||
|
}
|
||||||
|
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||||||
|
return rows[section].count
|
||||||
|
}
|
||||||
|
|
||||||
|
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||||||
|
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: TileletGroupCellItem.Identifier, for: indexPath) as? TileletGroupCellItem else { return UICollectionViewCell() }
|
||||||
|
let currentItem = rows[indexPath.section][indexPath.row]
|
||||||
|
cell.updateCell(component: currentItem)
|
||||||
|
// let rowColors: (UIColor,UIColor) = indexPath.section % 2 == 0 ? (.green, .yellow) : (.blue, .brown)
|
||||||
|
// cell.backgroundColor = indexPath.row % 2 == 0 ? rowColors.0 : rowColors.1
|
||||||
|
return cell
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - TableCollectionViewLayoutDataDelegate
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
internal func collectionView(_ collectionView: UICollectionView, dataForItemAt indexPath: IndexPath) -> Tilelet {
|
||||||
|
return rows[indexPath.section][indexPath.row]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final class TileletGroupCellItem: UICollectionViewCell {
|
||||||
|
|
||||||
|
/// Identifier for TableCellItem
|
||||||
|
static let Identifier: String = String(describing: TileletGroupCellItem.self)
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Private Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Main view which holds the content of the cell
|
||||||
|
private let containerView = View()
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Initializers
|
||||||
|
//--------------------------------------------------
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
setupCell()
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
super.init(coder: coder)
|
||||||
|
setupCell()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setupCell() {
|
||||||
|
contentView.backgroundColor = .clear
|
||||||
|
addSubview(containerView)
|
||||||
|
containerView.pinToSuperView()
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Public Methods
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public func updateCell(component: Tilelet) {
|
||||||
|
containerView.subviews.forEach({ $0.removeFromSuperview() })
|
||||||
|
containerView.addSubview(component)
|
||||||
|
component.pinToSuperView()
|
||||||
|
}
|
||||||
|
}
|
||||||
142
VDS/Components/Tilelet/TileletGroup/TileletGroupFlowLayout.swift
Normal file
142
VDS/Components/Tilelet/TileletGroup/TileletGroupFlowLayout.swift
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
//
|
||||||
|
// TileletGroupPositionLayout.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 10/8/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import UIKit
|
||||||
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
protocol TiletGroupCollectionViewLayoutDataDelegate: AnyObject {
|
||||||
|
func collectionView(_ collectionView: UICollectionView, dataForItemAt indexPath: IndexPath) -> Tilelet
|
||||||
|
}
|
||||||
|
|
||||||
|
class TileletGroupFlowLayout : UICollectionViewFlowLayout {
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Private Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Parameter to store the layout attributes of cell, while calculating the size & position of the cell
|
||||||
|
private var itemCache: [UICollectionViewLayoutAttributes] = []
|
||||||
|
|
||||||
|
/// Parameter to store the total height of the collectionView
|
||||||
|
private var layoutHeight: CGFloat = 0.0
|
||||||
|
|
||||||
|
/// Parameter to store the total width of the collectionView
|
||||||
|
private var layoutWidth: CGFloat = 0.0
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Public Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
/// Spacing between items in the row
|
||||||
|
public var horizontalPadding: CGFloat = VDSLayout.space1X
|
||||||
|
|
||||||
|
/// Spacing between rows (sections)
|
||||||
|
public var verticalPadding: CGFloat = VDSLayout.space1X
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Internal Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
weak var delegate: TiletGroupCollectionViewLayoutDataDelegate?
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Overrides
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Calculates the layout attribute properties & total height of the collectionView
|
||||||
|
override func prepare() {
|
||||||
|
super.prepare()
|
||||||
|
|
||||||
|
itemCache.removeAll()
|
||||||
|
layoutHeight = 0.0
|
||||||
|
|
||||||
|
guard let collectionView, let delegate else { return }
|
||||||
|
|
||||||
|
let sections = collectionView.numberOfSections
|
||||||
|
var yPos: CGFloat = 0.0
|
||||||
|
|
||||||
|
/// Calculate the available width for items (subtract the left and right padding)
|
||||||
|
let collectionViewWidth = collectionView.bounds.width
|
||||||
|
|
||||||
|
/// Determine the number of columns and calculate item width based on available space
|
||||||
|
///
|
||||||
|
let columns = collectionView.numberOfItems(inSection: 0)
|
||||||
|
let totalPadding = horizontalPadding * CGFloat(columns - 1)
|
||||||
|
let availableWidth = collectionViewWidth - totalPadding
|
||||||
|
let itemWidth = availableWidth / CGFloat(columns)
|
||||||
|
|
||||||
|
for currentSection in 0..<sections {
|
||||||
|
let items = collectionView.numberOfItems(inSection: currentSection)
|
||||||
|
|
||||||
|
layoutWidth = 0.0
|
||||||
|
var xPos: CGFloat = 0.0
|
||||||
|
|
||||||
|
/// Looping through all the items in the section, visually these are each column in the row
|
||||||
|
for currentItem in 0..<items {
|
||||||
|
let indexPath = IndexPath(row: currentItem, section: currentSection)
|
||||||
|
let selectedItem = delegate.collectionView(collectionView, dataForItemAt: indexPath)
|
||||||
|
let itemHeight = estimateHeightFor(item: selectedItem, with: itemWidth, index: indexPath)
|
||||||
|
|
||||||
|
layoutWidth += itemWidth + (currentItem > 0 ? horizontalPadding : 0)
|
||||||
|
|
||||||
|
let attribute = UICollectionViewLayoutAttributes(forCellWith: indexPath)
|
||||||
|
attribute.frame = CGRect(x: xPos, y: yPos, width: itemWidth, height: itemHeight)
|
||||||
|
itemCache.append(attribute)
|
||||||
|
|
||||||
|
/// Update x position for the next item
|
||||||
|
xPos += itemWidth + horizontalPadding
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Determines the highest height from all the cells (columns) in the row
|
||||||
|
let highestHeightForSection = itemCache
|
||||||
|
.filter({ $0.indexPath.section == currentSection })
|
||||||
|
.sorted(by: { $0.frame.size.height > $1.frame.size.height })
|
||||||
|
.first?.frame.size.height ?? 0.0
|
||||||
|
|
||||||
|
/// Set the highest height as height to all the cells in the row for uniform height
|
||||||
|
itemCache
|
||||||
|
.filter({ $0.indexPath.section == currentSection })
|
||||||
|
.forEach { attributes in
|
||||||
|
attributes.frame.size.height = highestHeightForSection
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Adds the height to y position for the next section, including vertical padding
|
||||||
|
yPos += highestHeightForSection + verticalPadding
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutHeight = yPos - verticalPadding /// Adjust bottom padding to total height
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Fetches estimated height by calling the cell's component estimated height and adding padding
|
||||||
|
private func estimateHeightFor(item: Tilelet, with width: CGFloat, index: IndexPath) -> CGFloat {
|
||||||
|
let itemWidth = width
|
||||||
|
let maxSize = CGSize(width: itemWidth, height: CGFloat.greatestFiniteMagnitude)
|
||||||
|
let estItemSize = item.systemLayoutSizeFitting(maxSize, withHorizontalFittingPriority: .required, verticalFittingPriority: .fittingSizeLevel)
|
||||||
|
return estItemSize.height
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This will return the layout attributes for the elements in the defined rect
|
||||||
|
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
|
||||||
|
var visibleLayoutAttributes: [UICollectionViewLayoutAttributes] = []
|
||||||
|
for attributes in itemCache {
|
||||||
|
if attributes.frame.intersects(rect) {
|
||||||
|
visibleLayoutAttributes.append(attributes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return visibleLayoutAttributes
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This will return the layout attributes at particular indexPath
|
||||||
|
override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
|
||||||
|
return itemCache.first(where: { $0.indexPath == indexPath })
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the collectionView content size
|
||||||
|
override var collectionViewContentSize: CGSize {
|
||||||
|
return CGSize(width: collectionView?.bounds.width ?? layoutWidth, height: layoutHeight)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -12,6 +12,7 @@ import Combine
|
|||||||
|
|
||||||
/// Title Lockup ensures the readability of words on the screen
|
/// Title Lockup ensures the readability of words on the screen
|
||||||
/// with approved built in text size configurations.
|
/// with approved built in text size configurations.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTitleLockup)
|
@objc(VDSTitleLockup)
|
||||||
open class TitleLockup: View, ParentViewProtocol {
|
open class TitleLockup: View, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import Combine
|
|||||||
|
|
||||||
/// A toggle is a control that lets customers instantly turn on
|
/// A toggle is a control that lets customers instantly turn on
|
||||||
/// or turn off a single option, setting or function.
|
/// or turn off a single option, setting or function.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSToggle)
|
@objc(VDSToggle)
|
||||||
open class Toggle: Control, Changeable, FormFieldable, ParentViewProtocol {
|
open class Toggle: Control, Changeable, FormFieldable, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import Combine
|
|||||||
|
|
||||||
/// A toggle is a control that lets customers instantly turn on
|
/// A toggle is a control that lets customers instantly turn on
|
||||||
/// or turn off a single option, setting or function.
|
/// or turn off a single option, setting or function.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSToggleView)
|
@objc(VDSToggleView)
|
||||||
open class ToggleView: Control, Changeable, FormFieldable {
|
open class ToggleView: Control, Changeable, FormFieldable {
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import Combine
|
|||||||
/// A tooltip is an overlay that clarifies another component or content
|
/// A tooltip is an overlay that clarifies another component or content
|
||||||
/// element. It is triggered when a customer hovers, clicks or taps
|
/// element. It is triggered when a customer hovers, clicks or taps
|
||||||
/// the tooltip icon.
|
/// the tooltip icon.
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTooltip)
|
@objc(VDSTooltip)
|
||||||
open class Tooltip: Control, TooltipLaunchable {
|
open class Tooltip: Control, TooltipLaunchable {
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import UIKit
|
|||||||
import Combine
|
import Combine
|
||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTooltipAlertViewController)
|
@objc(VDSTooltipAlertViewController)
|
||||||
open class TooltipAlertViewController: UIViewController, Surfaceable {
|
open class TooltipAlertViewController: UIViewController, Surfaceable {
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import Foundation
|
|||||||
import UIKit
|
import UIKit
|
||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
|
@objcMembers
|
||||||
@objc(VDSTooltipDialog)
|
@objc(VDSTooltipDialog)
|
||||||
open class TooltipDialog: View, UIScrollViewDelegate, ParentViewProtocol {
|
open class TooltipDialog: View, UIScrollViewDelegate, ParentViewProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -1,14 +1,5 @@
|
|||||||
1.0.76
|
|
||||||
----------------
|
|
||||||
- ONEAPP-11355 - ListUnordered - Finished Development
|
|
||||||
- CXTDT-630735 - PriceLockup - Accessibility
|
|
||||||
- CXTDT-626164 - FootnoteGroup - Dark mode
|
|
||||||
- CXTDT-626180 - FootnoteItem - Symbol type padding
|
|
||||||
- CXTDT-586383 - Table - Line style can be selected for each row.
|
|
||||||
|
|
||||||
1.0.75
|
1.0.75
|
||||||
----------------
|
----------------
|
||||||
- CXTDT-624895 - Badge - Custom FillColor and TextColor
|
|
||||||
- CXTDT-578885 - Table - Setting appropriate accessiblity label for each cell.
|
- CXTDT-578885 - Table - Setting appropriate accessiblity label for each cell.
|
||||||
|
|
||||||
1.0.74
|
1.0.74
|
||||||
|
|||||||
@ -39,7 +39,6 @@ Using the system allows designers and developers to collaborate more easily and
|
|||||||
- ``InputField``
|
- ``InputField``
|
||||||
- ``Label``
|
- ``Label``
|
||||||
- ``Line``
|
- ``Line``
|
||||||
- ``ListUnordered``
|
|
||||||
- ``Loader``
|
- ``Loader``
|
||||||
- ``Modal``
|
- ``Modal``
|
||||||
- ``Notification``
|
- ``Notification``
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user