Compare commits

..

21 Commits

Author SHA1 Message Date
98dde01e18 Merge branch 'develop' of ssh://git@192.168.1.128:220/mbrucedogs/vds_ios.git into develop 2025-01-23 13:25:16 -06:00
78dd2d5df8 removed obj-c members
Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
2025-01-23 13:24:48 -06:00
58850aeb6e Merge branch 'develop' into vasavk/listUnordered 2025-01-06 17:16:27 -06:00
Sumanth Nadigadda
15a53964c5 Adding release note for CXTDT-586383 changes 2024-10-23 13:08:09 +05:30
Bruce, Matt R
762868609b Merge branch 'bugfix/CXTDT-626180' into 'develop'
Footnote Item - Padding issue fixed for the Symbol type ‘none'

See merge request BPHV_MIPS/vds_ios!320
2024-10-22 13:20:02 +00:00
Vasavi Kanamarlapudi
e256dfd209 Merge branch 'develop' of https://gitlab.verizon.com/BPHV_MIPS/vds_ios into vasavk/listUnordered
# Conflicts:
#	VDS/SupportingFiles/ReleaseNotes.txt
2024-10-22 14:48:36 +05:30
Vasavi Kanamarlapudi
a1236df9a9 Digital ACT-191 CXTDT-626180 defect: Footnote Item - Padding issue fixed for the Symbol type ‘none'. 2024-10-22 14:43:36 +05:30
Bruce, Matt R
539f10ffbf Merge branch 'bugfix/priceLockup' into 'develop'
Fixed the PriceLockup accessibility Issue - CXTDT-630735

See merge request BPHV_MIPS/vds_ios!318
2024-10-21 14:30:23 +00:00
Bruce, Matt R
cc530e5903 Merge branch 'develop' into 'bugfix/priceLockup'
# Conflicts:
#   VDS/SupportingFiles/ReleaseNotes.txt
2024-10-21 14:29:53 +00:00
Bruce, Matt R
482212e88c Merge branch 'bugfix/CXTDT-626164-footnoteGroup' into 'develop'
Fixed the defect CXTDT-626164 of FootnoteGroup

See merge request BPHV_MIPS/vds_ios!319
2024-10-21 14:28:34 +00:00
Vasavi Kanamarlapudi
47409d2905 Digital ACT-191 CXTDT-626164 defect: FootnoteGroup - Text not showing in Dark Mode 2024-10-21 15:26:58 +05:30
Vasavi Kanamarlapudi
16516fbeed Digital ACT-191 ONEAPP-11355 story: updated release notes 2024-10-21 12:47:43 +05:30
Vasavi Kanamarlapudi
484d12626e Merge branch 'develop' of https://gitlab.verizon.com/BPHV_MIPS/vds_ios into vasavk/listUnordered 2024-10-21 12:44:59 +05:30
Vasavi Kanamarlapudi
9856c0a482 Digital ACT-191 CXTDT-630735 defect: PriceLockup accessibility - to render equivalent information for the strike through price visually represents. 2024-10-21 12:39:14 +05:30
Vasavi Kanamarlapudi
4797e5a7f7 Digital ACT-191 ONEAPP-11355 story: adjusted alignments 2024-10-19 14:38:03 +05:30
Bruce, Matt R
942834ec3e Merge branch 'mbruce/bugfix' into 'develop'
updated version

See merge request BPHV_MIPS/vds_ios!316
2024-10-18 21:31:53 +00:00
Vasavi Kanamarlapudi
62aedc7c5a Digital ACT-191 ONEAPP-11355 story: changes done as per anatomy 2024-10-18 19:52:55 +05:30
Matt Bruce
2e3524cde6 updated version
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
2024-10-17 16:19:41 -05:00
Vasavi Kanamarlapudi
c352fbaac9 Digital ACT-191 ONEAPP-11355 story: added list unordered item model 2024-10-16 14:26:01 +05:30
Vasavi Kanamarlapudi
759ef0db5b Digital ACT-191 ONEAPP-11355 story: added change log and added class for docs 2024-10-16 14:24:45 +05:30
Vasavi Kanamarlapudi
dc7dbffcf6 Digital ACT-191 ONEAPP-11355 story: added new file for List Unordered 2024-10-16 14:23:30 +05:30
67 changed files with 381 additions and 407 deletions

View File

@ -23,6 +23,8 @@
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 */; };
@ -210,8 +212,6 @@
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,6 +243,9 @@
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>"; };
@ -461,8 +464,6 @@
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 */
@ -512,6 +513,16 @@
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 = (
@ -763,6 +774,7 @@
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 */,
@ -961,7 +973,6 @@
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 */,
@ -1176,15 +1187,6 @@
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 */
@ -1361,6 +1363,7 @@
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 */,
@ -1396,7 +1399,6 @@
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 */,
@ -1429,6 +1431,7 @@
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 */,
@ -1475,7 +1478,6 @@
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 */,
@ -1669,7 +1671,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 = 74; CURRENT_PROJECT_VERSION = 75;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
@ -1707,7 +1709,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 = 74; CURRENT_PROJECT_VERSION = 75;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;

View File

@ -10,7 +10,6 @@ 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 {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -28,7 +28,6 @@ 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 {

View File

@ -10,7 +10,6 @@ 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 {

View File

@ -10,7 +10,6 @@ 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 {

View File

@ -8,7 +8,6 @@
import Foundation import Foundation
import UIKit import UIKit
@objcMembers
@objc(VDSClearPopoverViewController) @objc(VDSClearPopoverViewController)
open class ClearPopoverViewController: UIViewController, UIPopoverPresentationControllerDelegate { open class ClearPopoverViewController: UIViewController, UIPopoverPresentationControllerDelegate {

View File

@ -15,7 +15,6 @@ 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 {

View File

@ -11,7 +11,6 @@ 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 {

View File

@ -13,7 +13,6 @@ 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 {

View File

@ -13,7 +13,6 @@ 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 {

View File

@ -15,7 +15,6 @@ 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 {

View File

@ -11,7 +11,6 @@ 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 {

View File

@ -11,7 +11,6 @@ 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 {

View File

@ -16,7 +16,6 @@ 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 {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -16,7 +16,6 @@ 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 {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -11,7 +11,6 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -9,7 +9,6 @@ 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> {

View File

@ -4,7 +4,6 @@ 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> {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -11,7 +11,6 @@ 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> {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -10,7 +10,6 @@ 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 {
@ -111,6 +110,12 @@ 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.

View File

@ -11,7 +11,6 @@ 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 {
@ -207,7 +206,7 @@ open class FootnoteItem: View {
// Update symbolLabel // Update symbolLabel
symbolLabel.text = symbolType symbolLabel.text = symbolType
symbolLabel.isHidden = hideSymbol symbolLabel.isHidden = symbolType.isEmpty ? true : 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

View File

@ -13,7 +13,6 @@ 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 {

View File

@ -11,7 +11,6 @@ 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> {

View File

@ -39,6 +39,27 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -10,7 +10,6 @@ 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 {

View File

@ -0,0 +1,239 @@
//
// 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 dont 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
}
}

View File

@ -0,0 +1,41 @@
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

View File

@ -0,0 +1,23 @@
//
// 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
}
}
}

View File

@ -11,7 +11,6 @@ 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 {

View File

@ -10,7 +10,6 @@ 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 {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -9,7 +9,6 @@ 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 {

View File

@ -10,7 +10,6 @@ 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 {

View File

@ -14,7 +14,6 @@ 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 {

View File

@ -11,7 +11,6 @@ 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 {

View File

@ -9,7 +9,6 @@ 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 {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -9,7 +9,6 @@ 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 {
@ -140,6 +139,7 @@ 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,6 +217,24 @@ 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

View File

@ -11,7 +11,6 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -13,7 +13,6 @@ 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 {

View File

@ -11,7 +11,6 @@ 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 {

View File

@ -11,7 +11,6 @@ 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> {

View File

@ -10,7 +10,6 @@ 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 {

View File

@ -11,8 +11,7 @@ import VDSCoreTokens
import Combine import Combine
extension Tabs { extension Tabs {
@objcMembers @objc(VDSTab)
@objc(VDSTab)
open class Tab: Control, Groupable { open class Tab: Control, Groupable {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -10,7 +10,6 @@ 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 doesnt 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 doesnt need to be compared.
@objcMembers
@objc(VDSTabs) @objc(VDSTabs)
open class Tabs: View, ParentViewProtocol { open class Tabs: View, ParentViewProtocol {

View File

@ -8,7 +8,6 @@
import Foundation import Foundation
import UIKit import UIKit
@objcMembers
@objc(VDSTabsContainer) @objc(VDSTabsContainer)
open class TabsContainer: View { open class TabsContainer: View {

View File

@ -13,7 +13,6 @@ 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> {

View File

@ -10,7 +10,6 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 thats longer than a single line. /// Use a text area when you want customers to enter text thats longer than a single line.
@objcMembers
@objc(VDSTextArea) @objc(VDSTextArea)
open class TextArea: EntryFieldBase<String> { open class TextArea: EntryFieldBase<String> {
//-------------------------------------------------- //--------------------------------------------------

View File

@ -10,7 +10,6 @@ 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 {

View File

@ -10,7 +10,6 @@ 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> {

View File

@ -15,7 +15,6 @@ 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 {

View File

@ -1,187 +0,0 @@
//
// 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()
}
}

View File

@ -1,142 +0,0 @@
//
// 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)
}
}

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -12,7 +12,6 @@ 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 {

View File

@ -13,7 +13,6 @@ 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 {

View File

@ -10,7 +10,6 @@ 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 {

View File

@ -9,7 +9,6 @@ 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 {

View File

@ -1,5 +1,14 @@
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

View File

@ -39,6 +39,7 @@ 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``