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}}