diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index ad2df115..03aa3d87 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -44,7 +44,9 @@ EA89200628B526D6006B9984 /* CheckboxGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200528B526D6006B9984 /* CheckboxGroup.swift */; }; EA89201328B568D8006B9984 /* RadioBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89201228B568D8006B9984 /* RadioBox.swift */; }; EA89201528B56CF4006B9984 /* RadioBoxGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89201428B56CF4006B9984 /* RadioBoxGroup.swift */; }; - EAA5EEE228F4C62C003B3210 /* Colorable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAA5EEE128F4C62C003B3210 /* Colorable.swift */; }; + EAA5EEB528ECBFB4003B3210 /* ImageLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAA5EEB428ECBFB4003B3210 /* ImageLabelAttribute.swift */; }; + EAA5EEB728ECC03A003B3210 /* ToolTipLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAA5EEB628ECC03A003B3210 /* ToolTipLabelAttribute.swift */; }; + EAA5EEB928ECD24B003B3210 /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EAA5EEB828ECD24B003B3210 /* Icons.xcassets */; }; EAA5EEE428F5B855003B3210 /* VerizonNHGDS-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = EAA5EEE328F5B855003B3210 /* VerizonNHGDS-Light.otf */; }; EAA5EEEF28F5C908003B3210 /* VDSTypographyTokens.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAA5EEEC28F5C908003B3210 /* VDSTypographyTokens.xcframework */; }; EAA5EEF128F5C909003B3210 /* VDSColorTokens.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAA5EEED28F5C908003B3210 /* VDSColorTokens.xcframework */; }; @@ -56,6 +58,9 @@ EAB1D2EA28AE84AA00DAE764 /* UIControlPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2E928AE84AA00DAE764 /* UIControlPublisher.swift */; }; EAC9257D29119B5400091998 /* TextLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC9257C29119B5400091998 /* TextLink.swift */; }; EAC925832911B35400091998 /* TextLinkCaret.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC925822911B35300091998 /* TextLinkCaret.swift */; }; + EAC925842911C63100091998 /* Colorable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAA5EEDF28F49DB3003B3210 /* Colorable.swift */; }; + EAC9258C2911C9DE00091998 /* TextEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC925872911C9DE00091998 /* TextEntryField.swift */; }; + EAC9258F2911C9DE00091998 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC9258B2911C9DE00091998 /* EntryField.swift */; }; EAD8D2C128BFDE8B006EB6A6 /* UIGestureRecognizer+Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAD8D2C028BFDE8B006EB6A6 /* UIGestureRecognizer+Publisher.swift */; }; EAF7F0952899861000B287F5 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0932899861000B287F5 /* Checkbox.swift */; }; EAF7F09A2899B17200B287F5 /* CATransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0992899B17200B287F5 /* CATransaction.swift */; }; @@ -64,16 +69,16 @@ EAF7F0A2289AFB3900B287F5 /* Errorable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0A1289AFB3900B287F5 /* Errorable.swift */; }; EAF7F0A4289B017C00B287F5 /* LabelAttributeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0A3289B017C00B287F5 /* LabelAttributeModel.swift */; }; EAF7F0A6289B0CE000B287F5 /* Resetable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0A5289B0CE000B287F5 /* Resetable.swift */; }; - EAF7F0AB289B13FD00B287F5 /* LabelAttributeFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AA289B13FD00B287F5 /* LabelAttributeFont.swift */; }; - EAF7F0AD289B142900B287F5 /* LabelAttributeStrikeThrough.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AC289B142900B287F5 /* LabelAttributeStrikeThrough.swift */; }; - EAF7F0AF289B144C00B287F5 /* LabelAttributeUnderline.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AE289B144C00B287F5 /* LabelAttributeUnderline.swift */; }; - EAF7F0B1289B177F00B287F5 /* LabelAttributeColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0B0289B177F00B287F5 /* LabelAttributeColor.swift */; }; - EAF7F0B3289B1ADC00B287F5 /* LabelAttributeAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0B2289B1ADC00B287F5 /* LabelAttributeAction.swift */; }; + EAF7F0AB289B13FD00B287F5 /* FontLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AA289B13FD00B287F5 /* FontLabelAttribute.swift */; }; + EAF7F0AD289B142900B287F5 /* StrikeThroughLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AC289B142900B287F5 /* StrikeThroughLabelAttribute.swift */; }; + EAF7F0AF289B144C00B287F5 /* UnderlineLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0AE289B144C00B287F5 /* UnderlineLabelAttribute.swift */; }; + EAF7F0B1289B177F00B287F5 /* ColorLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0B0289B177F00B287F5 /* ColorLabelAttribute.swift */; }; + EAF7F0B3289B1ADC00B287F5 /* ActionLabelAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0B2289B1ADC00B287F5 /* ActionLabelAttribute.swift */; }; EAF7F0B5289C126F00B287F5 /* UILabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0B4289C126F00B287F5 /* UILabel.swift */; }; EAF7F0B7289C12A600B287F5 /* UITapGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0B6289C12A600B287F5 /* UITapGestureRecognizer.swift */; }; EAF7F0B9289C139800B287F5 /* ColorConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0B8289C139800B287F5 /* ColorConfiguration.swift */; }; EAF7F11728A1475A00B287F5 /* RadioButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F11528A1475A00B287F5 /* RadioButton.swift */; }; - EAF7F13328A2A16500B287F5 /* LabelAttributeAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F13228A2A16500B287F5 /* LabelAttributeAttachment.swift */; }; + EAF7F13328A2A16500B287F5 /* AttachmentLabelAttributeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F13228A2A16500B287F5 /* AttachmentLabelAttributeModel.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -125,7 +130,10 @@ EA89200528B526D6006B9984 /* CheckboxGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxGroup.swift; sourceTree = ""; }; EA89201228B568D8006B9984 /* RadioBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioBox.swift; sourceTree = ""; }; EA89201428B56CF4006B9984 /* RadioBoxGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioBoxGroup.swift; sourceTree = ""; }; - EAA5EEE128F4C62C003B3210 /* Colorable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Colorable.swift; sourceTree = ""; }; + EAA5EEB428ECBFB4003B3210 /* ImageLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageLabelAttribute.swift; sourceTree = ""; }; + EAA5EEB628ECC03A003B3210 /* ToolTipLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolTipLabelAttribute.swift; sourceTree = ""; }; + EAA5EEB828ECD24B003B3210 /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = ""; }; + EAA5EEDF28F49DB3003B3210 /* Colorable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colorable.swift; sourceTree = ""; }; EAA5EEE328F5B855003B3210 /* VerizonNHGDS-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "VerizonNHGDS-Light.otf"; sourceTree = ""; }; EAA5EEEC28F5C908003B3210 /* VDSTypographyTokens.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = VDSTypographyTokens.xcframework; path = ../SharedFrameworks/VDSTypographyTokens.xcframework; sourceTree = ""; }; EAA5EEED28F5C908003B3210 /* VDSColorTokens.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = VDSColorTokens.xcframework; path = ../SharedFrameworks/VDSColorTokens.xcframework; sourceTree = ""; }; @@ -137,6 +145,8 @@ EAB1D2E928AE84AA00DAE764 /* UIControlPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControlPublisher.swift; sourceTree = ""; }; EAC9257C29119B5400091998 /* TextLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextLink.swift; sourceTree = ""; }; EAC925822911B35300091998 /* TextLinkCaret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextLinkCaret.swift; sourceTree = ""; }; + EAC925872911C9DE00091998 /* TextEntryField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextEntryField.swift; sourceTree = ""; }; + EAC9258B2911C9DE00091998 /* EntryField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; EAD8D2C028BFDE8B006EB6A6 /* UIGestureRecognizer+Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIGestureRecognizer+Publisher.swift"; sourceTree = ""; }; EAF7F0932899861000B287F5 /* Checkbox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = ""; }; EAF7F0992899B17200B287F5 /* CATransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CATransaction.swift; sourceTree = ""; }; @@ -145,16 +155,16 @@ EAF7F0A1289AFB3900B287F5 /* Errorable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Errorable.swift; sourceTree = ""; }; EAF7F0A3289B017C00B287F5 /* LabelAttributeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeModel.swift; sourceTree = ""; }; EAF7F0A5289B0CE000B287F5 /* Resetable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Resetable.swift; sourceTree = ""; }; - EAF7F0AA289B13FD00B287F5 /* LabelAttributeFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeFont.swift; sourceTree = ""; }; - EAF7F0AC289B142900B287F5 /* LabelAttributeStrikeThrough.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeStrikeThrough.swift; sourceTree = ""; }; - EAF7F0AE289B144C00B287F5 /* LabelAttributeUnderline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeUnderline.swift; sourceTree = ""; }; - EAF7F0B0289B177F00B287F5 /* LabelAttributeColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeColor.swift; sourceTree = ""; }; - EAF7F0B2289B1ADC00B287F5 /* LabelAttributeAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeAction.swift; sourceTree = ""; }; + EAF7F0AA289B13FD00B287F5 /* FontLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontLabelAttribute.swift; sourceTree = ""; }; + EAF7F0AC289B142900B287F5 /* StrikeThroughLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StrikeThroughLabelAttribute.swift; sourceTree = ""; }; + EAF7F0AE289B144C00B287F5 /* UnderlineLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnderlineLabelAttribute.swift; sourceTree = ""; }; + EAF7F0B0289B177F00B287F5 /* ColorLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorLabelAttribute.swift; sourceTree = ""; }; + EAF7F0B2289B1ADC00B287F5 /* ActionLabelAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionLabelAttribute.swift; sourceTree = ""; }; EAF7F0B4289C126F00B287F5 /* UILabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILabel.swift; sourceTree = ""; }; EAF7F0B6289C12A600B287F5 /* UITapGestureRecognizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITapGestureRecognizer.swift; sourceTree = ""; }; EAF7F0B8289C139800B287F5 /* ColorConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorConfiguration.swift; sourceTree = ""; }; EAF7F11528A1475A00B287F5 /* RadioButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioButton.swift; sourceTree = ""; }; - EAF7F13228A2A16500B287F5 /* LabelAttributeAttachment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeAttachment.swift; sourceTree = ""; }; + EAF7F13228A2A16500B287F5 /* AttachmentLabelAttributeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentLabelAttributeModel.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -187,6 +197,16 @@ path = Button; sourceTree = ""; }; + EA0FC2BE2912D18200DF80B4 /* Buttons */ = { + isa = PBXGroup; + children = ( + 5FC35BE128D513EB004EBEAC /* Button */, + EAC9257E29119B5D00091998 /* TextLink */, + EAC925812911B34300091998 /* TextLinkCaret */, + ); + path = Buttons; + sourceTree = ""; + }; EA1F265F28B945070033E859 /* RadioSwatch */ = { isa = PBXGroup; children = ( @@ -255,14 +275,13 @@ isa = PBXGroup; children = ( EA4DB2FE28DCBC1900103EE3 /* Badge */, - 5FC35BE128D513EB004EBEAC /* Button */, + EA0FC2BE2912D18200DF80B4 /* Buttons */, EAF7F092289985E200B287F5 /* Checkbox */, EA3362412892EF700071C351 /* Label */, EA89200B28B530F0006B9984 /* RadioBox */, EAF7F11428A1470D00B287F5 /* RadioButton */, EA1F265F28B945070033E859 /* RadioSwatch */, - EAC9257E29119B5D00091998 /* TextLink */, - EAC925812911B34300091998 /* TextLinkCaret */, + EAC925852911C9DE00091998 /* TextFields */, EA3361A0288B1E6F0071C351 /* Toggle */, ); path = Components; @@ -294,7 +313,7 @@ children = ( EA3361C4289030FC0071C351 /* Accessable.swift */, EA4DB2FC28D3D0CA00103EE3 /* AnyEquatable.swift */, - EAA5EEE128F4C62C003B3210 /* Colorable.swift */, + EAA5EEDF28F49DB3003B3210 /* Colorable.swift */, EA3361AC288B26190071C351 /* DataTrackable.swift */, EA3361A9288B25E40071C351 /* Disabling.swift */, EAF7F0A1289AFB3900B287F5 /* Errorable.swift */, @@ -343,6 +362,7 @@ isa = PBXGroup; children = ( EA3361FF2891E14C0071C351 /* Fonts */, + EAA5EEB828ECD24B003B3210 /* Icons.xcassets */, ); path = SupportingFiles; sourceTree = ""; @@ -421,6 +441,31 @@ path = TextLinkCaret; sourceTree = ""; }; + EAC925852911C9DE00091998 /* TextFields */ = { + isa = PBXGroup; + children = ( + EAC925862911C9DE00091998 /* TextEntryField */, + EAC925892911C9DE00091998 /* EntryField */, + ); + path = TextFields; + sourceTree = ""; + }; + EAC925862911C9DE00091998 /* TextEntryField */ = { + isa = PBXGroup; + children = ( + EAC925872911C9DE00091998 /* TextEntryField.swift */, + ); + path = TextEntryField; + sourceTree = ""; + }; + EAC925892911C9DE00091998 /* EntryField */ = { + isa = PBXGroup; + children = ( + EAC9258B2911C9DE00091998 /* EntryField.swift */, + ); + path = EntryField; + sourceTree = ""; + }; EAF7F092289985E200B287F5 /* Checkbox */ = { isa = PBXGroup; children = ( @@ -434,12 +479,14 @@ isa = PBXGroup; children = ( EAF7F0A3289B017C00B287F5 /* LabelAttributeModel.swift */, - EAF7F0B2289B1ADC00B287F5 /* LabelAttributeAction.swift */, - EAF7F13228A2A16500B287F5 /* LabelAttributeAttachment.swift */, - EAF7F0B0289B177F00B287F5 /* LabelAttributeColor.swift */, - EAF7F0AA289B13FD00B287F5 /* LabelAttributeFont.swift */, - EAF7F0AC289B142900B287F5 /* LabelAttributeStrikeThrough.swift */, - EAF7F0AE289B144C00B287F5 /* LabelAttributeUnderline.swift */, + EAF7F0B2289B1ADC00B287F5 /* ActionLabelAttribute.swift */, + EAF7F13228A2A16500B287F5 /* AttachmentLabelAttributeModel.swift */, + EAF7F0B0289B177F00B287F5 /* ColorLabelAttribute.swift */, + EAF7F0AA289B13FD00B287F5 /* FontLabelAttribute.swift */, + EAA5EEB428ECBFB4003B3210 /* ImageLabelAttribute.swift */, + EAF7F0AC289B142900B287F5 /* StrikeThroughLabelAttribute.swift */, + EAA5EEB628ECC03A003B3210 /* ToolTipLabelAttribute.swift */, + EAF7F0AE289B144C00B287F5 /* UnderlineLabelAttribute.swift */, ); path = Attributes; sourceTree = ""; @@ -549,6 +596,7 @@ EA3362072891E14D0071C351 /* VerizonNHGeDS-Regular.otf in Resources */, EA3362062891E14D0071C351 /* VerizonNHGeTX-Regular.otf in Resources */, EA3362052891E14D0071C351 /* VerizonNHGeDS-Bold.otf in Resources */, + EAA5EEB928ECD24B003B3210 /* Icons.xcassets in Resources */, EAA5EEE428F5B855003B3210 /* VerizonNHGDS-Light.otf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -573,12 +621,15 @@ EA3361C328902D960071C351 /* Toggle.swift in Sources */, EAF7F0A0289AB7EC00B287F5 /* View.swift in Sources */, EA89201328B568D8006B9984 /* RadioBox.swift in Sources */, + EAC9258C2911C9DE00091998 /* TextEntryField.swift in Sources */, EA3362402892EF6C0071C351 /* Label.swift in Sources */, - EAF7F0B3289B1ADC00B287F5 /* LabelAttributeAction.swift in Sources */, + EAF7F0B3289B1ADC00B287F5 /* ActionLabelAttribute.swift in Sources */, EAC925832911B35400091998 /* TextLinkCaret.swift in Sources */, EA33622E2891EA3C0071C351 /* DispatchQueue+Once.swift in Sources */, EA4DB2FD28D3D0CA00103EE3 /* AnyEquatable.swift in Sources */, - EAF7F0AF289B144C00B287F5 /* LabelAttributeUnderline.swift in Sources */, + EAA5EEB728ECC03A003B3210 /* ToolTipLabelAttribute.swift in Sources */, + EAF7F0AF289B144C00B287F5 /* UnderlineLabelAttribute.swift in Sources */, + EAC925842911C63100091998 /* Colorable.swift in Sources */, EA3361C5289030FC0071C351 /* Accessable.swift in Sources */, EA33622C2891E73B0071C351 /* FontProtocol.swift in Sources */, EAF7F11728A1475A00B287F5 /* RadioButton.swift in Sources */, @@ -588,9 +639,10 @@ EA4DB30228DCBCA500103EE3 /* Badge.swift in Sources */, EA33624728931B050071C351 /* Initable.swift in Sources */, EAF7F0A4289B017C00B287F5 /* LabelAttributeModel.swift in Sources */, - EAF7F0B1289B177F00B287F5 /* LabelAttributeColor.swift in Sources */, + EAF7F0B1289B177F00B287F5 /* ColorLabelAttribute.swift in Sources */, + EAC9258F2911C9DE00091998 /* EntryField.swift in Sources */, EAB1D2EA28AE84AA00DAE764 /* UIControlPublisher.swift in Sources */, - EAF7F13328A2A16500B287F5 /* LabelAttributeAttachment.swift in Sources */, + EAF7F13328A2A16500B287F5 /* AttachmentLabelAttributeModel.swift in Sources */, EA89200628B526D6006B9984 /* CheckboxGroup.swift in Sources */, EAD8D2C128BFDE8B006EB6A6 /* UIGestureRecognizer+Publisher.swift in Sources */, EAF7F0B9289C139800B287F5 /* ColorConfiguration.swift in Sources */, @@ -604,19 +656,19 @@ EA1F266528B945070033E859 /* RadioSwatch.swift in Sources */, EA4DB18528CA967F00103EE3 /* SelectorGroupHandlerBase.swift in Sources */, EA89200228AECF2A006B9984 /* UIButton+Publisher.swift in Sources */, - EAF7F0AB289B13FD00B287F5 /* LabelAttributeFont.swift in Sources */, + EAF7F0AB289B13FD00B287F5 /* FontLabelAttribute.swift in Sources */, EAB1D29C28A5618900DAE764 /* RadioButtonGroup.swift in Sources */, EA336171288B19200071C351 /* VDS.docc in Sources */, + EAA5EEB528ECBFB4003B3210 /* ImageLabelAttribute.swift in Sources */, EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */, EA3361AA288B25E40071C351 /* Disabling.swift in Sources */, EA3361B6288B2A410071C351 /* Control.swift in Sources */, 5F21D7BF28DCEB3D003E7CD6 /* Useable.swift in Sources */, EAF7F0B7289C12A600B287F5 /* UITapGestureRecognizer.swift in Sources */, EA3361AD288B26190071C351 /* DataTrackable.swift in Sources */, - EAA5EEE228F4C62C003B3210 /* Colorable.swift in Sources */, EA33623E2892EE950071C351 /* UIDevice.swift in Sources */, EA3362302891EB4A0071C351 /* Fonts.swift in Sources */, - EAF7F0AD289B142900B287F5 /* LabelAttributeStrikeThrough.swift in Sources */, + EAF7F0AD289B142900B287F5 /* StrikeThroughLabelAttribute.swift in Sources */, EA3361B8288B2AAA0071C351 /* ViewProtocol.swift in Sources */, EA3361BF288B2EA60071C351 /* Handlerable.swift in Sources */, EA3361A8288B23300071C351 /* UIColor.swift in Sources */, diff --git a/VDS/Classes/Control.swift b/VDS/Classes/Control.swift index 79a26591..0f7a2631 100644 --- a/VDS/Classes/Control.swift +++ b/VDS/Classes/Control.swift @@ -66,6 +66,8 @@ open class Control: UIControl, Handlerable, ViewProtocol, Resettable { if !initialSetupPerformed { initialSetupPerformed = true setup() + setupDidChangeEvent() + updateView() } } @@ -79,11 +81,6 @@ open class Control: UIControl, Handlerable, ViewProtocol, Resettable { //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- - open override func layoutSubviews() { - super.layoutSubviews() - updateView() - } - open func updateView() {} open func reset() { diff --git a/VDS/Classes/View.swift b/VDS/Classes/View.swift index 1a08301a..837d81a8 100644 --- a/VDS/Classes/View.swift +++ b/VDS/Classes/View.swift @@ -65,12 +65,9 @@ open class View: UIView, Handlerable, ViewProtocol, Resettable { if !initialSetupPerformed { initialSetupPerformed = true setup() - } - } - - open override func layoutSubviews() { - super.layoutSubviews() - updateView() + setupDidChangeEvent() + updateView() + } } //-------------------------------------------------- diff --git a/VDS/Components/Button/Button.swift b/VDS/Components/Buttons/Button/Button.swift similarity index 95% rename from VDS/Components/Button/Button.swift rename to VDS/Components/Buttons/Button/Button.swift index 0d5ed7d5..4a065e3e 100644 --- a/VDS/Components/Button/Button.swift +++ b/VDS/Components/Buttons/Button/Button.swift @@ -31,7 +31,8 @@ open class Button: UIButton, Handlerable, ViewProtocol, Resettable, Useable { private var minWidthConstraint: NSLayoutConstraint? private var widthConstraint: NSLayoutConstraint? private var heightConstraint: NSLayoutConstraint? - + private var initialSetupPerformed = false + //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -120,11 +121,15 @@ open class Button: UIButton, Handlerable, ViewProtocol, Resettable, Useable { // MARK: - Public Functions //-------------------------------------------------- open func initialSetup() { - backgroundColor = .clear - translatesAutoresizingMaskIntoConstraints = false - accessibilityCustomActions = [] - accessibilityTraits = .staticText - setup() + if !initialSetupPerformed { + backgroundColor = .clear + translatesAutoresizingMaskIntoConstraints = false + accessibilityCustomActions = [] + accessibilityTraits = .staticText + setup() + setupDidChangeEvent() + updateView() + } } open func setup() { @@ -150,11 +155,6 @@ open class Button: UIButton, Handlerable, ViewProtocol, Resettable, Useable { accessibilityCustomActions = [] accessibilityTraits = .staticText } - - open override func layoutSubviews() { - super.layoutSubviews() - updateView() - } //-------------------------------------------------- // MARK: - Overrides diff --git a/VDS/Components/TextLink/TextLink.swift b/VDS/Components/Buttons/TextLink/TextLink.swift similarity index 97% rename from VDS/Components/TextLink/TextLink.swift rename to VDS/Components/Buttons/TextLink/TextLink.swift index 13da46d2..b4eedd81 100644 --- a/VDS/Components/TextLink/TextLink.swift +++ b/VDS/Components/Buttons/TextLink/TextLink.swift @@ -96,7 +96,7 @@ open class TextLink: Control { label.disabled = disabled label.typograpicalStyle = size == .large ? TypographicalStyle.BodyLarge : TypographicalStyle.BodySmall label.text = text ?? "" - label.attributes = [LabelAttributeUnderline(location: 0, length: label.text!.count)] + label.attributes = [UnderlineLabelAttribute(location: 0, length: label.text!.count)] heightConstraint?.constant = height } diff --git a/VDS/Components/TextLinkCaret/TextLinkCaret.swift b/VDS/Components/Buttons/TextLinkCaret/TextLinkCaret.swift similarity index 100% rename from VDS/Components/TextLinkCaret/TextLinkCaret.swift rename to VDS/Components/Buttons/TextLinkCaret/TextLinkCaret.swift diff --git a/VDS/Components/Label/Attributes/LabelAttributeAction.swift b/VDS/Components/Label/Attributes/ActionLabelAttribute.swift similarity index 82% rename from VDS/Components/Label/Attributes/LabelAttributeAction.swift rename to VDS/Components/Label/Attributes/ActionLabelAttribute.swift index 7e280a42..fe3b2012 100644 --- a/VDS/Components/Label/Attributes/LabelAttributeAction.swift +++ b/VDS/Components/Label/Attributes/ActionLabelAttribute.swift @@ -9,18 +9,18 @@ import Foundation import UIKit import Combine -public protocol LabelAttributeActionable: LabelAttributeModel { +public protocol ActionLabelAttributeModel: LabelAttributeModel { var accessibleText: String? { get set } var action: PassthroughSubject { get set } } -public struct LabelAttributeActionModel: LabelAttributeActionable { +public struct ActionLabelAttribute: ActionLabelAttributeModel { - public static func == (lhs: LabelAttributeActionModel, rhs: LabelAttributeActionModel) -> Bool { + public static func == (lhs: ActionLabelAttribute, rhs: ActionLabelAttribute) -> Bool { lhs.isEqual(rhs) } - public func isEqual(_ equatable: LabelAttributeActionModel) -> Bool { + public func isEqual(_ equatable: ActionLabelAttribute) -> Bool { return id == equatable.id && range == equatable.range } diff --git a/VDS/Components/Label/Attributes/LabelAttributeAttachment.swift b/VDS/Components/Label/Attributes/AttachmentLabelAttributeModel.swift similarity index 84% rename from VDS/Components/Label/Attributes/LabelAttributeAttachment.swift rename to VDS/Components/Label/Attributes/AttachmentLabelAttributeModel.swift index 35008d14..5de6f4b2 100644 --- a/VDS/Components/Label/Attributes/LabelAttributeAttachment.swift +++ b/VDS/Components/Label/Attributes/AttachmentLabelAttributeModel.swift @@ -8,11 +8,11 @@ import Foundation import UIKit -public protocol LabelAttributeAttachment: LabelAttributeModel { +public protocol AttachmentLabelAttributeModel: LabelAttributeModel { func getAttachment() throws -> NSTextAttachment } -extension LabelAttributeAttachment { +extension AttachmentLabelAttributeModel { public func setAttribute(on attributedString: NSMutableAttributedString) { do { let mutableString = NSMutableAttributedString() diff --git a/VDS/Components/Label/Attributes/LabelAttributeColor.swift b/VDS/Components/Label/Attributes/ColorLabelAttribute.swift similarity index 89% rename from VDS/Components/Label/Attributes/LabelAttributeColor.swift rename to VDS/Components/Label/Attributes/ColorLabelAttribute.swift index 6d3f35aa..8d70296d 100644 --- a/VDS/Components/Label/Attributes/LabelAttributeColor.swift +++ b/VDS/Components/Label/Attributes/ColorLabelAttribute.swift @@ -8,8 +8,8 @@ import Foundation import UIKit -public struct LabelAttributeColor: LabelAttributeModel { - public func isEqual(_ equatable: LabelAttributeColor) -> Bool { +public struct ColorLabelAttribute: LabelAttributeModel { + public func isEqual(_ equatable: ColorLabelAttribute) -> Bool { return id == equatable.id && range == equatable.range && color == equatable.color } //-------------------------------------------------- diff --git a/VDS/Components/Label/Attributes/LabelAttributeFont.swift b/VDS/Components/Label/Attributes/FontLabelAttribute.swift similarity index 91% rename from VDS/Components/Label/Attributes/LabelAttributeFont.swift rename to VDS/Components/Label/Attributes/FontLabelAttribute.swift index af559184..6456b76c 100644 --- a/VDS/Components/Label/Attributes/LabelAttributeFont.swift +++ b/VDS/Components/Label/Attributes/FontLabelAttribute.swift @@ -8,8 +8,8 @@ import Foundation import UIKit -public struct LabelAttributeFont: LabelAttributeModel { - public func isEqual(_ equatable: LabelAttributeFont) -> Bool { +public struct FontLabelAttribute: LabelAttributeModel { + public func isEqual(_ equatable: FontLabelAttribute) -> Bool { return id == equatable.id && range == equatable.range && color == equatable.color diff --git a/VDS/Components/Label/Attributes/ImageLabelAttribute.swift b/VDS/Components/Label/Attributes/ImageLabelAttribute.swift new file mode 100644 index 00000000..9bba6287 --- /dev/null +++ b/VDS/Components/Label/Attributes/ImageLabelAttribute.swift @@ -0,0 +1,44 @@ +// +// LabelSystemImageLabelAttribute.swift +// VDS +// +// Created by Matt Bruce on 10/4/22. +// + +import Foundation +import UIKit + +public struct ImageLabelAttribute: AttachmentLabelAttributeModel { + public enum Error: Swift.Error { + case bundleNotFound + case imageNotFound(String) + } + public var id = UUID() + public var location: Int + public var length: Int + public var imageName: String + public var frame: CGRect + public var tintColor: UIColor + public static func == (lhs: ImageLabelAttribute, rhs: ImageLabelAttribute) -> Bool { + lhs.isEqual(rhs) + } + + public func isEqual(_ equatable: ImageLabelAttribute) -> Bool { + return id == equatable.id && range == equatable.range && imageName == equatable.imageName + } + + public func getAttachment() throws -> NSTextAttachment { + guard let bundle = Bundle(identifier: "com.vzw.vds") else { + throw Error.bundleNotFound + } + + guard let image = UIImage(named: imageName, in: bundle, with: nil) else { + throw Error.imageNotFound(imageName) + } + + let attachment = NSTextAttachment() + attachment.image = image.withTintColor(tintColor) + attachment.bounds = frame + return attachment + } +} diff --git a/VDS/Components/Label/Attributes/LabelAttributeStrikeThrough.swift b/VDS/Components/Label/Attributes/StrikeThroughLabelAttribute.swift similarity index 84% rename from VDS/Components/Label/Attributes/LabelAttributeStrikeThrough.swift rename to VDS/Components/Label/Attributes/StrikeThroughLabelAttribute.swift index 6b62691c..93650f2b 100644 --- a/VDS/Components/Label/Attributes/LabelAttributeStrikeThrough.swift +++ b/VDS/Components/Label/Attributes/StrikeThroughLabelAttribute.swift @@ -8,8 +8,8 @@ import Foundation import UIKit -public struct LabelAttributeStrikeThrough: LabelAttributeModel { - public func isEqual(_ equatable: LabelAttributeStrikeThrough) -> Bool { +public struct StrikeThroughLabelAttribute: LabelAttributeModel { + public func isEqual(_ equatable: StrikeThroughLabelAttribute) -> Bool { return id == equatable.id && range == equatable.range } diff --git a/VDS/Components/Label/Attributes/ToolTipLabelAttribute.swift b/VDS/Components/Label/Attributes/ToolTipLabelAttribute.swift new file mode 100644 index 00000000..39e6277c --- /dev/null +++ b/VDS/Components/Label/Attributes/ToolTipLabelAttribute.swift @@ -0,0 +1,39 @@ +// +// ToolTipLabelAttribute.swift +// VDS +// +// Created by Matt Bruce on 10/4/22. +// + +import Foundation +import UIKit +import Combine + +public struct ToolTipLabelAttribute: ActionLabelAttributeModel { + public var id = UUID() + public var accessibleText: String? = "Tool Tip" + public var action = PassthroughSubject() + public var location: Int + public var length: Int + public var tintColor: UIColor + + public func setAttribute(on attributedString: NSMutableAttributedString) { + let image = ImageLabelAttribute(location: location, + length: length, + imageName: "info", + frame: .init(x: 0, y: -2, width: 13.3, height: 13.3), + tintColor: tintColor) + + image.setAttribute(on: attributedString) + + } + + public static func == (lhs: ToolTipLabelAttribute, rhs: ToolTipLabelAttribute) -> Bool { + lhs.isEqual(rhs) + } + + public func isEqual(_ equatable: ToolTipLabelAttribute) -> Bool { + return id == equatable.id && range == equatable.range + } +} + diff --git a/VDS/Components/Label/Attributes/LabelAttributeUnderline.swift b/VDS/Components/Label/Attributes/UnderlineLabelAttribute.swift similarity index 95% rename from VDS/Components/Label/Attributes/LabelAttributeUnderline.swift rename to VDS/Components/Label/Attributes/UnderlineLabelAttribute.swift index e1358c2e..d1d9399b 100644 --- a/VDS/Components/Label/Attributes/LabelAttributeUnderline.swift +++ b/VDS/Components/Label/Attributes/UnderlineLabelAttribute.swift @@ -8,9 +8,9 @@ import Foundation import UIKit -public struct LabelAttributeUnderline: LabelAttributeModel { +public struct UnderlineLabelAttribute: LabelAttributeModel { - public func isEqual(_ equatable: LabelAttributeUnderline) -> Bool { + public func isEqual(_ equatable: UnderlineLabelAttribute) -> Bool { return id == equatable.id && range == equatable.range && color == equatable.color diff --git a/VDS/Components/Label/Label.swift b/VDS/Components/Label/Label.swift index 67d4b837..449c9c80 100644 --- a/VDS/Components/Label/Label.swift +++ b/VDS/Components/Label/Label.swift @@ -26,11 +26,13 @@ open class LabelBase: UILabel, Handlerable, ViewProtocol, Resettable { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- + private var initialSetupPerformed = false + open var surface: Surface = .light { didSet { didChange() }} open var disabled: Bool = false { didSet { isEnabled = !disabled } } - open var attributes: [any LabelAttributeModel]? { didSet { didChange() }} + open var attributes: [any LabelAttributeModel]? { didSet { didChange() }} open var typograpicalStyle: TypographicalStyle = .defaultStyle { didSet { didChange() }} @@ -85,13 +87,17 @@ open class LabelBase: UILabel, Handlerable, ViewProtocol, Resettable { // MARK: - Public Functions //-------------------------------------------------- open func initialSetup() { - backgroundColor = .clear - numberOfLines = 0 - lineBreakMode = .byWordWrapping - translatesAutoresizingMaskIntoConstraints = false - accessibilityCustomActions = [] - accessibilityTraits = .staticText - setup() + if !initialSetupPerformed { + backgroundColor = .clear + numberOfLines = 0 + lineBreakMode = .byWordWrapping + translatesAutoresizingMaskIntoConstraints = false + accessibilityCustomActions = [] + accessibilityTraits = .staticText + setup() + setupDidChangeEvent() + updateView() + } } open func setup() {} @@ -111,12 +117,7 @@ open class LabelBase: UILabel, Handlerable, ViewProtocol, Resettable { //-------------------------------------------------- // MARK: - Overrides - //-------------------------------------------------- - open override func layoutSubviews() { - super.layoutSubviews() - updateView() - } - + //-------------------------------------------------- open func updateView() { textAlignment = textPosition.textAlignment textColor = textColorConfiguration.getColor(self) @@ -142,7 +143,7 @@ open class LabelBase: UILabel, Handlerable, ViewProtocol, Resettable { attribute.setAttribute(on: mutableText) //see if the attribute is Actionable - if let actionable = attribute as? any LabelAttributeActionable{ + if let actionable = attribute as? any ActionLabelAttributeModel{ //create a accessibleAction let customAccessibilityAction = customAccessibilityAction(range: actionable.range, accessibleText: actionable.accessibleText) diff --git a/VDS/Components/TextFields/EntryField/EntryField.swift b/VDS/Components/TextFields/EntryField/EntryField.swift new file mode 100644 index 00000000..88e4e7ed --- /dev/null +++ b/VDS/Components/TextFields/EntryField/EntryField.swift @@ -0,0 +1,373 @@ +// +// EntryField.swift +// VDS +// +// Created by Matt Bruce on 10/3/22. +// + +import Foundation +import UIKit +import VDSColorTokens +import VDSFormControlsTokens +import Combine + +public enum HelperTextPlacement: String, CaseIterable { + case bottom, right +} + +open class EntryField: Control, Accessable { + //-------------------------------------------------- + // 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: - Private Properties + //-------------------------------------------------- + internal var stackView: UIStackView = { + return UIStackView().with { + $0.translatesAutoresizingMaskIntoConstraints = false + $0.axis = .vertical + $0.distribution = .fill + } + }() + + internal var titleLabel = Label().with { + $0.setContentCompressionResistancePriority(.required, for: .vertical) + $0.attributes = [] + } + + internal var errorLabel = Label().with { + $0.setContentCompressionResistancePriority(.required, for: .vertical) + } + + internal var helperLabel = Label().with { + $0.setContentCompressionResistancePriority(.required, for: .vertical) + } + + internal var containerView: UIView = { + return UIView().with { + $0.translatesAutoresizingMaskIntoConstraints = false + } + }() + + internal var tooltipView: UIView? + + //-------------------------------------------------- + // MARK: - Configuration Properties + //-------------------------------------------------- + // Sizes are from InVision design specs. + internal let containerSize = CGSize(width: 45, height: 45) + + internal let primaryColorConfig = DisabledSurfaceColorConfiguration().with { + $0.disabled.lightColor = VDSColor.interactiveDisabledOnlight + $0.disabled.darkColor = VDSColor.interactiveDisabledOndark + $0.enabled.lightColor = VDSColor.elementsPrimaryOnlight + $0.enabled.darkColor = VDSColor.elementsPrimaryOndark + } + + internal let secondaryColorConfig = DisabledSurfaceColorConfiguration().with { + $0.disabled.lightColor = VDSColor.interactiveDisabledOnlight + $0.disabled.darkColor = VDSColor.interactiveDisabledOndark + $0.enabled.lightColor = VDSColor.elementsSecondaryOnlight + $0.enabled.darkColor = VDSColor.elementsSecondaryOndark + } + + internal lazy var backgroundColorConfiguration: AnyColorable = { + return getBackgroundConfig() + }() + + internal lazy var borderColorConfiguration: AnyColorable = { + return getBorderConfig() + }() + + //-------------------------------------------------- + // MARK: - Public Properties + //-------------------------------------------------- + open var labelText: String? { didSet { didChange() }} + + open var helperText: String? { didSet { didChange() }} + + open var showError: Bool = false { didSet { didChange() }} + + open var errorText: String? { didSet { didChange() }} + + open var tooltipTitle: String? { didSet { didChange() }} + + open var tooltipContent: String? { didSet { didChange() }} + + open var transparentBackground: Bool = false { didSet { didChange() }} + + open var width: CGFloat? { didSet { didChange() }} + + open var maxLength: Int? { didSet { didChange() }} + + open var inputId: String? { didSet { didChange() }} + + open var value: AnyHashable? { didSet { didChange() }} + + open var defaultValue: AnyHashable? { didSet { didChange() }} + + open var required: Bool = false { didSet { didChange() }} + + open var readOnly: Bool = false { didSet { didChange() }} + + open var accessibilityHintEnabled: String? { didSet { didChange() }} + + open var accessibilityHintDisabled: String? { didSet { didChange() }} + + open var accessibilityValueEnabled: String? { didSet { didChange() }} + + open var accessibilityValueDisabled: String? { didSet { didChange() }} + + open var accessibilityLabelEnabled: String? { didSet { didChange() }} + + open var accessibilityLabelDisabled: String? { didSet { didChange() }} + + //-------------------------------------------------- + // MARK: - Constraints + //-------------------------------------------------- + internal var heightConstraint: NSLayoutConstraint? + internal var widthConstraint: NSLayoutConstraint? + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + open override func setup() { + super.setup() + + //add tapGesture to self + publisher(for: UITapGestureRecognizer()).sink { [weak self] _ in + self?.sendActions(for: .touchUpInside) + }.store(in: &subscribers) + + isAccessibilityElement = true + accessibilityTraits = .button + addSubview(stackView) + + //create the wrapping view + heightConstraint = containerView.heightAnchor.constraint(greaterThanOrEqualToConstant: containerSize.height) + heightConstraint?.isActive = true + + widthConstraint = containerView.widthAnchor.constraint(equalToConstant: 0) + + let container = getContainer() + stackView.addArrangedSubview(titleLabel) + stackView.addArrangedSubview(container) + stackView.addArrangedSubview(errorLabel) + stackView.addArrangedSubview(helperLabel) + + stackView.setCustomSpacing(4, after: titleLabel) + stackView.setCustomSpacing(8, after: container) + stackView.setCustomSpacing(8, after: errorLabel) + + stackView.topAnchor.constraint(equalTo: topAnchor).isActive = true + stackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + stackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + stackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + + titleLabel.textColorConfiguration = primaryColorConfig.eraseToAnyColorable() + errorLabel.textColorConfiguration = primaryColorConfig.eraseToAnyColorable() + helperLabel.textColorConfiguration = secondaryColorConfig.eraseToAnyColorable() + } + + open func getContainer() -> UIView { + return containerView + } + + open func getBackgroundConfig() -> AnyColorable { + return ErrorDisabledSurfaceColorConfiguration().with { + $0.enabled.lightColor = VDSFormControlsColor.backgroundOnlight + $0.enabled.darkColor = VDSFormControlsColor.backgroundOndark + $0.disabled.lightColor = VDSFormControlsColor.backgroundOnlight + $0.disabled.darkColor = VDSFormControlsColor.backgroundOndark + + //error doesn't care enabled/disable + $0.error.lightColor = VDSColor.feedbackErrorBackgroundOnlight + $0.error.darkColor = VDSColor.feedbackErrorBackgroundOndark + }.eraseToAnyColorable() + } + + open func getBorderConfig() -> AnyColorable { + return ErrorDisabledSurfaceColorConfiguration().with { + $0.enabled.lightColor = VDSFormControlsColor.borderOnlight + $0.enabled.darkColor = VDSFormControlsColor.borderOnlight + $0.disabled.lightColor = VDSColor.interactiveDisabledOnlight + $0.disabled.darkColor = VDSColor.interactiveDisabledOndark + + //error doesn't care enabled/disable + $0.error.lightColor = VDSColor.feedbackErrorOnlight + $0.error.darkColor = VDSColor.feedbackErrorOndark + }.eraseToAnyColorable() + } + + open func getToolTipView() -> UIView? { + guard let tooltipTitle, let tooltipContent else { + return nil + } + + let stack = UIStackView().with { + $0.translatesAutoresizingMaskIntoConstraints = false + $0.axis = .vertical + $0.distribution = .fill + $0.spacing = 4 + } + + let title = Label().with { + $0.setContentCompressionResistancePriority(.required, for: .vertical) + $0.textPosition = .left + $0.typograpicalStyle = .BoldBodySmall + $0.text = tooltipTitle + $0.surface = surface + $0.disabled = disabled + } + + let content = Label().with { + $0.setContentCompressionResistancePriority(.required, for: .vertical) + $0.textPosition = .left + $0.typograpicalStyle = .BoldBodySmall + $0.text = tooltipContent + $0.surface = surface + $0.disabled = disabled + } + + stack.addArrangedSubview(title) + stack.addArrangedSubview(content) + + stack.backgroundColor = backgroundColorConfiguration.getColor(self) + + return stack + } + + open func showToolTipView(){ + print("toolTip clicked: showToolTipView() called") + } + + public override func reset() { + super.reset() + setAccessibilityLabel() + } + + //-------------------------------------------------- + // MARK: - State + //-------------------------------------------------- + open override func updateView() { + + containerView.backgroundColor = backgroundColorConfiguration.getColor(self) + containerView.layer.borderColor = borderColorConfiguration.getColor(self).cgColor + containerView.layer.borderWidth = 1 + containerView.layer.cornerRadius = 4 + + updateTitleLabel() + updateErrorLabel() + updateHelperLabel() + + setAccessibilityHint() + backgroundColor = surface.color + } + + open func updateTitleLabel() { + + //update the local vars for the label since we no + //long have a model + var attributes: [any LabelAttributeModel] = [] + var updatedLabelText = labelText + + //dealing with the "Optional" addition to the text + if let oldText = updatedLabelText, !required, !oldText.hasSuffix("Optional") { + let optionColorAttr = ColorLabelAttribute(location: oldText.count + 2, + length: 8, + color: secondaryColorConfig.getColor(self)) + + updatedLabelText = "\(oldText) Optional" + attributes.append(optionColorAttr) + } + + //add the tool tip + if let view = getToolTipView(), let oldText = updatedLabelText { + tooltipView = view + let toolTipAction = PassthroughSubject() + let toolTipUpdateText = "\(oldText) " //create a little space between the final character and tooltip image + let toolTipAttribute = ToolTipLabelAttribute(action: toolTipAction, + location: toolTipUpdateText.count, + length: 1, + tintColor: primaryColorConfig.getColor(self)) + updatedLabelText = toolTipUpdateText + attributes.append(toolTipAttribute) + toolTipAction.sink { [weak self] in + self?.showToolTipView() + }.store(in: &subscribers) + } else { + tooltipView = nil + } + + //set the titleLabel + titleLabel.textPosition = .left + titleLabel.typograpicalStyle = .BodySmall + titleLabel.text = updatedLabelText + titleLabel.attributes = attributes + titleLabel.surface = surface + titleLabel.disabled = disabled + + } + + open func updateErrorLabel(){ + if showError, let errorText { + errorLabel.textPosition = .left + errorLabel.typograpicalStyle = .BodySmall + errorLabel.text = errorText + errorLabel.surface = surface + errorLabel.disabled = disabled + errorLabel.isHidden = false + } else { + errorLabel.isHidden = true + } + } + + open func updateHelperLabel(){ + //set the helper label position + if let helperText { + helperLabel.textPosition = .left + helperLabel.typograpicalStyle = .BodySmall + helperLabel.text = helperText + helperLabel.surface = surface + helperLabel.disabled = disabled + helperLabel.isHidden = false + } else { + helperLabel.isHidden = true + } + } +} + +//-------------------------------------------------- +// MARK: - Color Class Configurations +//-------------------------------------------------- +internal class ErrorDisabledSurfaceColorConfiguration: DisabledSurfaceColorable { + typealias ModelType = Errorable & Surfaceable & Disabling + var error = SurfaceColorConfiguration() + var disabled = SurfaceColorConfiguration() + var enabled = SurfaceColorConfiguration() + + required public init(){} + + func getColor(_ viewModel: any ModelType) -> UIColor { + //only show error is enabled and showError == true + let showErrorColor = !viewModel.disabled && viewModel.showError + + if showErrorColor { + return error.getColor(viewModel) + } else { + return getDisabledColor(viewModel) + } + } +} diff --git a/VDS/Components/TextFields/TextEntryField/TextEntryField.swift b/VDS/Components/TextFields/TextEntryField/TextEntryField.swift new file mode 100644 index 00000000..7fc10471 --- /dev/null +++ b/VDS/Components/TextFields/TextEntryField/TextEntryField.swift @@ -0,0 +1,219 @@ +// +// TextEntryField.swift +// VDS +// +// Created by Matt Bruce on 10/3/22. +// + +import Foundation +import UIKit +import VDSColorTokens +import VDSFormControlsTokens +import Combine + +public enum TextEntryFieldType: String, CaseIterable { + case text, number, calendar, inlineAction, password, creditCard, tel, date, securityCode +} + +public class TextEntryField: TextEntryFieldBase{} + +open class TextEntryFieldBase: EntryField { + //-------------------------------------------------- + // 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: - Private Properties + //-------------------------------------------------- + internal var containerStackView: UIStackView = { + return UIStackView().with { + $0.translatesAutoresizingMaskIntoConstraints = false + $0.axis = .horizontal + $0.distribution = .fill + $0.spacing = 12 + } + }() + + //-------------------------------------------------- + // MARK: - Public Properties + //-------------------------------------------------- + + open var type: TextEntryFieldType = .text { didSet { didChange() }} + + open var showSuccess: Bool = false { didSet { didChange() }} + + open var successText: String? { didSet { didChange() }} + + open var helperTextPlacement: HelperTextPlacement = .bottom { didSet { didChange() }} + + private var successLabel = Label().with { + $0.setContentCompressionResistancePriority(.required, for: .vertical) + } + + internal var minWidthConstraint: NSLayoutConstraint? + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + open override func setup() { + super.setup() + + minWidthConstraint = containerView.widthAnchor.constraint(greaterThanOrEqualToConstant: 0) + minWidthConstraint?.isActive = true + + stackView.addArrangedSubview(successLabel) + stackView.setCustomSpacing(8, after: successLabel) + + successLabel.textColorConfiguration = primaryColorConfig.eraseToAnyColorable() + + } + + open override func getContainer() -> UIView { + containerStackView.addArrangedSubview(containerView) + return containerStackView + } + + open override func getBackgroundConfig() -> AnyColorable { + return TextEntryFieldColorConfiguration().with { + $0.enabled.lightColor = VDSFormControlsColor.backgroundOnlight + $0.enabled.darkColor = VDSFormControlsColor.backgroundOndark + $0.disabled.lightColor = VDSFormControlsColor.backgroundOnlight + $0.disabled.darkColor = VDSFormControlsColor.backgroundOndark + + //error/success doesn't care enabled/disable + $0.error.lightColor = VDSColor.feedbackErrorBackgroundOnlight + $0.error.darkColor = VDSColor.feedbackErrorBackgroundOndark + $0.success.lightColor = VDSColor.feedbackSuccessBackgroundOnlight + $0.success.darkColor = VDSColor.feedbackSuccessBackgroundOndark + }.eraseToAnyColorable() + } + + open override func getBorderConfig() -> AnyColorable { + return TextEntryFieldColorConfiguration().with { + $0.enabled.lightColor = VDSFormControlsColor.borderOnlight + $0.enabled.darkColor = VDSFormControlsColor.borderOnlight + $0.disabled.lightColor = VDSColor.interactiveDisabledOnlight + $0.disabled.darkColor = VDSColor.interactiveDisabledOndark + + //error/success doesn't care enabled/disable + $0.error.lightColor = VDSColor.feedbackErrorOnlight + $0.error.darkColor = VDSColor.feedbackErrorOndark + $0.success.lightColor = VDSColor.feedbackSuccessOnlight + $0.success.darkColor = VDSColor.feedbackSuccessOndark + }.eraseToAnyColorable() + } + + //-------------------------------------------------- + // MARK: - State + //-------------------------------------------------- + open override func updateView() { + super.updateView() + + //show error or success + if showError, let _ = errorText { + successLabel.isHidden = true + + } else if showSuccess, let successText { + successLabel.textPosition = .left + successLabel.typograpicalStyle = .BodySmall + successLabel.text = successText + successLabel.surface = surface + successLabel.disabled = disabled + successLabel.isHidden = false + errorLabel.isHidden = true + + } else { + successLabel.isHidden = true + + } + + //set the width constraints + if let width, width > type.width { + widthConstraint?.constant = width + widthConstraint?.isActive = true + minWidthConstraint?.isActive = false + } else { + minWidthConstraint?.constant = type.width + widthConstraint?.isActive = false + minWidthConstraint?.isActive = true + } + } + + open override func updateHelperLabel(){ + //remove first + helperLabel.removeFromSuperview() + + super.updateHelperLabel() + + //set the helper label position + if helperText != nil { + if helperTextPlacement == .right { + containerStackView.spacing = 12 + containerStackView.distribution = .fillEqually + containerStackView.addArrangedSubview(helperLabel) + } else { + containerStackView.spacing = 0 + containerStackView.distribution = .fill + stackView.addArrangedSubview(helperLabel) + } + } + } + + internal class TextEntryFieldColorConfiguration: DisabledSurfaceColorable { + var success = SurfaceColorConfiguration() + var error = SurfaceColorConfiguration() + var disabled = SurfaceColorConfiguration() + var enabled = SurfaceColorConfiguration() + + required init(){} + + func getColor(_ object: TextEntryField) -> UIColor { + //only show error is enabled and showError == true + let showErrorColor = !object.disabled && object.showError + let showSuccessColor = !object.disabled && object.showSuccess + + if showErrorColor { + return error.getColor(object) + + } else if showSuccessColor { + return success.getColor(object) + + } else { + return getDisabledColor(object) + } + } + } + +} + +extension TextEntryFieldType { + var width: CGFloat { + switch self { + case .inlineAction: + return 102 + case .password: + return 62.0 + case .creditCard: + return 288.0 + case .tel: + return 176.0 + case .date: + return 114.0 + case .securityCode: + return 88.0 + default: + return 40.0 + } + } +} diff --git a/VDS/Protocols/Handlerable.swift b/VDS/Protocols/Handlerable.swift index 70c2508f..db3ad4ab 100644 --- a/VDS/Protocols/Handlerable.swift +++ b/VDS/Protocols/Handlerable.swift @@ -17,6 +17,12 @@ public protocol Handlerable: AnyObject, Initable, Disabling, Surfaceable { extension Handlerable { + public func setupDidChangeEvent() { + handlerPublisher().sink { [weak self] _ in + self?.updateView() + }.store(in: &subscribers) + } + public func handlerPublisher() -> AnyPublisher { subject .eraseToAnyPublisher() @@ -28,6 +34,5 @@ extension Handlerable { extension Handlerable where Self: UIView { public func didChange() { subject.send() - setNeedsLayout() } } diff --git a/VDS/SupportingFiles/Icons.xcassets/Contents.json b/VDS/SupportingFiles/Icons.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/amex.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/amex.imageset/Contents.json new file mode 100644 index 00000000..610ffbd7 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/amex.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "amex.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/amex.imageset/amex.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/amex.imageset/amex.svg new file mode 100644 index 00000000..de85ed53 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/amex.imageset/amex.svg @@ -0,0 +1,8 @@ + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/credit-card.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/credit-card.imageset/Contents.json new file mode 100644 index 00000000..df2d7bca --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/credit-card.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "credit-card.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/credit-card.imageset/credit-card.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/credit-card.imageset/credit-card.svg new file mode 100644 index 00000000..a5975ebf --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/credit-card.imageset/credit-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub-inverted.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub-inverted.imageset/Contents.json new file mode 100644 index 00000000..b4949ace --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub-inverted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "dinersClub-inverted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub-inverted.imageset/dinersClub-inverted.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub-inverted.imageset/dinersClub-inverted.svg new file mode 100644 index 00000000..1c8b4ccc --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub-inverted.imageset/dinersClub-inverted.svg @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub.imageset/Contents.json new file mode 100644 index 00000000..6a22c2dd --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "dinersClub.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub.imageset/dinersClub.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub.imageset/dinersClub.svg new file mode 100644 index 00000000..083ed5af --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/dinersClub.imageset/dinersClub.svg @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Contents.json new file mode 100644 index 00000000..ae99049b --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "discover.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/discover.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/discover.svg new file mode 100644 index 00000000..a056ab58 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/discover.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic-inverted.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic-inverted.imageset/Contents.json new file mode 100644 index 00000000..49581273 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic-inverted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "generic-inverted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic-inverted.imageset/generic-inverted.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic-inverted.imageset/generic-inverted.svg new file mode 100644 index 00000000..42904015 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic-inverted.imageset/generic-inverted.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic.imageset/Contents.json new file mode 100644 index 00000000..b0026068 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "generic.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic.imageset/generic.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic.imageset/generic.svg new file mode 100644 index 00000000..38b925ee --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/generic.imageset/generic.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/Contents.json new file mode 100644 index 00000000..5798433a --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "jcb.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb.svg new file mode 100644 index 00000000..ab197f4b --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/mastercard.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/mastercard.imageset/Contents.json new file mode 100644 index 00000000..3ee10a5c --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/mastercard.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "mastercard.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/mastercard.imageset/mastercard.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/mastercard.imageset/mastercard.svg new file mode 100644 index 00000000..dc3082aa --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/mastercard.imageset/mastercard.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder-inverted.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder-inverted.imageset/Contents.json new file mode 100644 index 00000000..caf02da3 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder-inverted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "placeholder-inverted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder-inverted.imageset/placeholder-inverted.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder-inverted.imageset/placeholder-inverted.svg new file mode 100644 index 00000000..06f4891e --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder-inverted.imageset/placeholder-inverted.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder.imageset/Contents.json new file mode 100644 index 00000000..d039c34d --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "placeholder.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder.imageset/placeholder.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder.imageset/placeholder.svg new file mode 100644 index 00000000..842da557 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/placeholder.imageset/placeholder.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode-inverted.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode-inverted.imageset/Contents.json new file mode 100644 index 00000000..2c8a3508 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode-inverted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "securityCode-inverted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode-inverted.imageset/securityCode-inverted.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode-inverted.imageset/securityCode-inverted.svg new file mode 100644 index 00000000..75f8a3f9 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode-inverted.imageset/securityCode-inverted.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode.imageset/Contents.json new file mode 100644 index 00000000..21980ced --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "securityCode.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode.imageset/securityCode.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode.imageset/securityCode.svg new file mode 100644 index 00000000..f1c6353e --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCode.imageset/securityCode.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex-inverted.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex-inverted.imageset/Contents.json new file mode 100644 index 00000000..4bc9d730 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex-inverted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "securityCodeAmex-inverted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex-inverted.imageset/securityCodeAmex-inverted.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex-inverted.imageset/securityCodeAmex-inverted.svg new file mode 100644 index 00000000..7d8b5a6a --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex-inverted.imageset/securityCodeAmex-inverted.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex.imageset/Contents.json new file mode 100644 index 00000000..c4dc8123 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "securityCodeAmex.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex.imageset/securityCodeAmex.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex.imageset/securityCodeAmex.svg new file mode 100644 index 00000000..226b265d --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/securityCodeAmex.imageset/securityCodeAmex.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa-inverted.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa-inverted.imageset/Contents.json new file mode 100644 index 00000000..f1e909a2 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa-inverted.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "visa-inverted.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa-inverted.imageset/visa-inverted.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa-inverted.imageset/visa-inverted.svg new file mode 100644 index 00000000..7277b618 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa-inverted.imageset/visa-inverted.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa.imageset/Contents.json new file mode 100644 index 00000000..680fa238 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "visa.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa.imageset/visa.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa.imageset/visa.svg new file mode 100644 index 00000000..26ee8433 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/visa.imageset/visa.svg @@ -0,0 +1,7 @@ + + + diff --git a/VDS/SupportingFiles/Icons.xcassets/checkmark-alt.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/checkmark-alt.imageset/Contents.json new file mode 100644 index 00000000..50ccb6e9 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/checkmark-alt.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "checkmark-alt.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/checkmark-alt.imageset/checkmark-alt.svg b/VDS/SupportingFiles/Icons.xcassets/checkmark-alt.imageset/checkmark-alt.svg new file mode 100644 index 00000000..0fc5f61c --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/checkmark-alt.imageset/checkmark-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/VDS/SupportingFiles/Icons.xcassets/error.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/error.imageset/Contents.json new file mode 100644 index 00000000..a2f87247 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/error.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "error.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/error.imageset/error.svg b/VDS/SupportingFiles/Icons.xcassets/error.imageset/error.svg new file mode 100644 index 00000000..eb392746 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/error.imageset/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/VDS/SupportingFiles/Icons.xcassets/info.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/info.imageset/Contents.json new file mode 100644 index 00000000..adcd08a2 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/info.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "info.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/VDS/SupportingFiles/Icons.xcassets/info.imageset/info.svg b/VDS/SupportingFiles/Icons.xcassets/info.imageset/info.svg new file mode 100644 index 00000000..5fe83ac9 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/info.imageset/info.svg @@ -0,0 +1 @@ + \ No newline at end of file