diff --git a/Backpack-SwiftUI/Icons/Classes/BPKIcon.swift b/Backpack-SwiftUI/Icons/Classes/BPKIcon.swift index 23a6405cb..c48b2e2b3 100644 --- a/Backpack-SwiftUI/Icons/Classes/BPKIcon.swift +++ b/Backpack-SwiftUI/Icons/Classes/BPKIcon.swift @@ -15,9 +15,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import Backpack_Common public struct BPKIcon { public let name: String + let bundle: Bundle + + init (name: String, bundle: Bundle = BPKCommonBundle.iconsBundle) { + self.name = name + self.bundle = bundle + } public enum Size { case large, small diff --git a/Backpack-SwiftUI/Icons/Classes/BPKIconView.swift b/Backpack-SwiftUI/Icons/Classes/BPKIconView.swift index 859bcfea1..c257ab57e 100644 --- a/Backpack-SwiftUI/Icons/Classes/BPKIconView.swift +++ b/Backpack-SwiftUI/Icons/Classes/BPKIconView.swift @@ -83,11 +83,10 @@ private extension BPKIcon.Size { private extension Image { init(icon: BPKIcon, size: BPKIcon.Size = .small, shouldEnableAccessibility: Bool) { let iconName = "\(icon.name)-\(size.suffix)" - let bundle = BPKCommonBundle.iconsBundle if shouldEnableAccessibility { - self.init(iconName, bundle: bundle) + self.init(iconName, bundle: icon.bundle) } else { - self.init(decorative: iconName, bundle: bundle) + self.init(decorative: iconName, bundle: icon.bundle) } } } diff --git a/Backpack-SwiftUI/Icons/Classes/Generated/BPKIcons.swift b/Backpack-SwiftUI/Icons/Classes/Generated/BPKIcons.swift index fdde0267b..9521a32a3 100644 --- a/Backpack-SwiftUI/Icons/Classes/Generated/BPKIcons.swift +++ b/Backpack-SwiftUI/Icons/Classes/Generated/BPKIcons.swift @@ -298,7 +298,12 @@ public extension BPKIcon { public extension BPKIcon { // swiftlint:disable function_body_length cyclomatic_complexity - static func named(_ iconName: String) -> BPKIcon? { + static func named(_ iconName: String, bundle: Bundle? = nil) -> BPKIcon? { + + if let bundle { + return BPKIcon(name: iconName, bundle: bundle) + } + switch iconName { case "accessibility": return .accessibility case "account--add": return .accountAdd diff --git a/Backpack-SwiftUI/Tests/Icons/BPKIconViewTests.swift b/Backpack-SwiftUI/Tests/Icons/BPKIconViewTests.swift index 55141781a..99ce3cc61 100644 --- a/Backpack-SwiftUI/Tests/Icons/BPKIconViewTests.swift +++ b/Backpack-SwiftUI/Tests/Icons/BPKIconViewTests.swift @@ -53,4 +53,14 @@ class BPKIconViewTests: XCTestCase { func testAutoMirrorSmallIcon() { assertSnapshot(BPKIconView(.arrowLeft, size: .small)) } + + func testCustomSmallIcon() { + let bundle = Bundle(for: BPKIconViewTests.self) + assertSnapshot(BPKIconView(BPKIcon(name: "custom-icon", bundle: TestsBundle.bundle!), size: .small)) + } + + func testCustomLargeIcon() { + let bundle = Bundle(for: BPKIconViewTests.self) + assertSnapshot(BPKIconView(BPKIcon(name: "custom-icon", bundle: TestsBundle.bundle!), size: .large)) + } } diff --git a/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.dark-mode.png b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.dark-mode.png new file mode 100644 index 000000000..1e54528e7 Binary files /dev/null and b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.dark-mode.png differ diff --git a/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.light-mode.png b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.light-mode.png new file mode 100644 index 000000000..1c641aa6e Binary files /dev/null and b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.light-mode.png differ diff --git a/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.rtl.png b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.rtl.png new file mode 100644 index 000000000..1c641aa6e Binary files /dev/null and b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomLargeIcon.rtl.png differ diff --git a/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.dark-mode.png b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.dark-mode.png new file mode 100644 index 000000000..72e57ec40 Binary files /dev/null and b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.dark-mode.png differ diff --git a/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.light-mode.png b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.light-mode.png new file mode 100644 index 000000000..bb37e7b79 Binary files /dev/null and b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.light-mode.png differ diff --git a/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.rtl.png b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.rtl.png new file mode 100644 index 000000000..bb37e7b79 Binary files /dev/null and b/Backpack-SwiftUI/Tests/Icons/__Snapshots__/BPKIconViewTests/testCustomSmallIcon.rtl.png differ diff --git a/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-lg.imageset/Contents.json b/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-lg.imageset/Contents.json new file mode 100644 index 000000000..2ca9452c6 --- /dev/null +++ b/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-lg.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "custom-icon-lg.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-lg.imageset/custom-icon-lg.svg b/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-lg.imageset/custom-icon-lg.svg new file mode 100644 index 000000000..e1341af0a --- /dev/null +++ b/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-lg.imageset/custom-icon-lg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-sm.imageset/Contents.json b/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-sm.imageset/Contents.json new file mode 100644 index 000000000..2f750dba6 --- /dev/null +++ b/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-sm.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "custom-icon-sm.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-sm.imageset/custom-icon-sm.svg b/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-sm.imageset/custom-icon-sm.svg new file mode 100644 index 000000000..03ab62e83 --- /dev/null +++ b/Backpack-SwiftUI/Tests/Images.xcassets/custom-icon-sm.imageset/custom-icon-sm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/swiftui/BPKIcons.njk b/templates/swiftui/BPKIcons.njk index 81eee44c2..1a40e8412 100644 --- a/templates/swiftui/BPKIcons.njk +++ b/templates/swiftui/BPKIcons.njk @@ -25,7 +25,12 @@ public extension BPKIcon { public extension BPKIcon { // swiftlint:disable function_body_length cyclomatic_complexity - static func named(_ iconName: String) -> BPKIcon? { + static func named(_ iconName: String, bundle: Bundle? = nil) -> BPKIcon? { + + if let bundle { + return BPKIcon(name: iconName, bundle: bundle) + } + switch iconName { {% for icon in icons -%} case "{{icon.file}}": return .{{icon.name}}