From dc8632dcb72e6bdc1d96b43f6f950d1b092b53c3 Mon Sep 17 00:00:00 2001 From: Felix Lisczyk <5102728+FelixLisczyk@users.noreply.github.com> Date: Thu, 19 Feb 2026 13:32:45 +0100 Subject: [PATCH 1/3] Add optional tagline to onboarding welcome screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a new optional `tagline: String?` property to `UIOnboardingViewConfiguration`. When set, a styled UILabel is inserted between the title stack and the features list in `UIOnboardingStack`. When nil, the layout is bit-for-bit identical to the previous behaviour. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.6 --- .../UIOnboardingViewConfiguration.swift | 5 ++++- .../Views/UIOnboardingStack.swift | 21 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift b/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift index 927ef8f..64b37e8 100644 --- a/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift +++ b/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift @@ -11,14 +11,16 @@ public struct UIOnboardingViewConfiguration { public var appIcon: UIImage public var firstTitleLine: NSMutableAttributedString public var secondTitleLine: NSMutableAttributedString + public var tagline: String? = nil public var features: Array public let featureStyle: UIOnboardingFeatureStyle public var textViewConfiguration: UIOnboardingTextViewConfiguration? = nil public var buttonConfiguration: UIOnboardingButtonConfiguration - + public init(appIcon: UIImage, firstTitleLine: NSMutableAttributedString, secondTitleLine: NSMutableAttributedString, + tagline: String? = nil, features: Array, featureStyle: UIOnboardingFeatureStyle = .init(), textViewConfiguration: UIOnboardingTextViewConfiguration? = nil, @@ -26,6 +28,7 @@ public struct UIOnboardingViewConfiguration { self.appIcon = appIcon self.firstTitleLine = firstTitleLine self.secondTitleLine = secondTitleLine + self.tagline = tagline self.features = features self.featureStyle = featureStyle self.textViewConfiguration = textViewConfiguration diff --git a/Sources/UIOnboarding/Views/UIOnboardingStack.swift b/Sources/UIOnboarding/Views/UIOnboardingStack.swift index 4994e03..ebb053f 100644 --- a/Sources/UIOnboarding/Views/UIOnboardingStack.swift +++ b/Sources/UIOnboarding/Views/UIOnboardingStack.swift @@ -69,10 +69,27 @@ final class UIOnboardingStack: UIStackView { setCustomSpacing(26, after: onboardingIcon) addArrangedSubview(onboardingTitleLabelStack) - setCustomSpacing(traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing(), after: onboardingTitleLabelStack) onboardingTitleLabelStack.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true onboardingTitleLabelStack.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true - + + let titleSpacing: CGFloat = traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing() + if let taglineText = configuration.tagline { + setCustomSpacing(8, after: onboardingTitleLabelStack) + let taglineLabel = UILabel() + taglineLabel.text = taglineText + taglineLabel.font = .systemFont(ofSize: 17, weight: .semibold) + taglineLabel.textColor = .secondaryLabel + taglineLabel.numberOfLines = 0 + taglineLabel.adjustsFontSizeToFitWidth = true + taglineLabel.minimumScaleFactor = 0.8 + addArrangedSubview(taglineLabel) + taglineLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true + taglineLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true + setCustomSpacing(titleSpacing, after: taglineLabel) + } else { + setCustomSpacing(titleSpacing, after: onboardingTitleLabelStack) + } + addArrangedSubview(featuresList) featuresList.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true featuresList.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true From 921e188bf03af334dd107f2935a77619913d9049 Mon Sep 17 00:00:00 2001 From: Felix Lisczyk <5102728+FelixLisczyk@users.noreply.github.com> Date: Thu, 19 Feb 2026 14:23:15 +0100 Subject: [PATCH 2/3] Improve tagline visual design MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Style the onboarding tagline with italic medium weight at 20pt, brand blue tint at 45% opacity, and increased top spacing (8→14pt) so it reads as a distinct subtitle tier between the title and feature list. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.6 --- .../Configuration/UIOnboardingViewConfiguration.swift | 3 +++ Sources/UIOnboarding/Views/UIOnboardingStack.swift | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift b/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift index 64b37e8..5eeaa29 100644 --- a/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift +++ b/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift @@ -12,6 +12,7 @@ public struct UIOnboardingViewConfiguration { public var firstTitleLine: NSMutableAttributedString public var secondTitleLine: NSMutableAttributedString public var tagline: String? = nil + public var taglineColor: UIColor? = nil public var features: Array public let featureStyle: UIOnboardingFeatureStyle public var textViewConfiguration: UIOnboardingTextViewConfiguration? = nil @@ -21,6 +22,7 @@ public struct UIOnboardingViewConfiguration { firstTitleLine: NSMutableAttributedString, secondTitleLine: NSMutableAttributedString, tagline: String? = nil, + taglineColor: UIColor? = nil, features: Array, featureStyle: UIOnboardingFeatureStyle = .init(), textViewConfiguration: UIOnboardingTextViewConfiguration? = nil, @@ -29,6 +31,7 @@ public struct UIOnboardingViewConfiguration { self.firstTitleLine = firstTitleLine self.secondTitleLine = secondTitleLine self.tagline = tagline + self.taglineColor = taglineColor self.features = features self.featureStyle = featureStyle self.textViewConfiguration = textViewConfiguration diff --git a/Sources/UIOnboarding/Views/UIOnboardingStack.swift b/Sources/UIOnboarding/Views/UIOnboardingStack.swift index ebb053f..d787c8d 100644 --- a/Sources/UIOnboarding/Views/UIOnboardingStack.swift +++ b/Sources/UIOnboarding/Views/UIOnboardingStack.swift @@ -74,11 +74,15 @@ final class UIOnboardingStack: UIStackView { let titleSpacing: CGFloat = traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing() if let taglineText = configuration.tagline { - setCustomSpacing(8, after: onboardingTitleLabelStack) + setCustomSpacing(14, after: onboardingTitleLabelStack) let taglineLabel = UILabel() taglineLabel.text = taglineText - taglineLabel.font = .systemFont(ofSize: 17, weight: .semibold) - taglineLabel.textColor = .secondaryLabel + var taglineFont = UIFont.systemFont(ofSize: 20, weight: .medium) + if let italicDescriptor = taglineFont.fontDescriptor.withSymbolicTraits(.traitItalic) { + taglineFont = UIFont(descriptor: italicDescriptor, size: 20) + } + taglineLabel.font = taglineFont + taglineLabel.textColor = configuration.taglineColor ?? .secondaryLabel taglineLabel.numberOfLines = 0 taglineLabel.adjustsFontSizeToFitWidth = true taglineLabel.minimumScaleFactor = 0.8 From a79cb2a739f66e9a741a84d47da16b1cb310157e Mon Sep 17 00:00:00 2001 From: Felix Lisczyk <5102728+FelixLisczyk@users.noreply.github.com> Date: Thu, 19 Feb 2026 15:38:54 +0100 Subject: [PATCH 3/3] Add tagline to demo app configurations Updates all three demo apps (UIOnboarding Demo, UIOnboarding Demo SPM, UIOnboarding SwiftUI) to showcase the new optional tagline feature. Also syncs the embedded copy of UIOnboardingViewConfiguration and UIOnboardingStack in UIOnboarding Demo with the tagline support added to the library source. Co-Authored-By: Claude Sonnet 4.6 --- .../UIOnboardingHelper.swift | 5 ++++ .../UIOnboardingViewConfiguration.swift | 8 +++++- .../Onboarding/Views/UIOnboardingStack.swift | 25 +++++++++++++++++-- .../UIOnboardingHelper.swift | 5 ++++ .../UIOnboardingHelper.swift | 5 ++++ 5 files changed, 45 insertions(+), 3 deletions(-) diff --git a/Demo/UIOnboarding Demo SPM/UIOnboarding Demo SPM/UIOnboardingHelper.swift b/Demo/UIOnboarding Demo SPM/UIOnboarding Demo SPM/UIOnboardingHelper.swift index 32b814b..68549a9 100644 --- a/Demo/UIOnboarding Demo SPM/UIOnboarding Demo SPM/UIOnboardingHelper.swift +++ b/Demo/UIOnboarding Demo SPM/UIOnboarding Demo SPM/UIOnboardingHelper.swift @@ -27,6 +27,10 @@ struct UIOnboardingHelper { ]) } + static func setUpTagline() -> String { + "Know Every Rank" + } + static func setUpFeatures() -> Array { return .init([ .init(icon: .init(named: "feature-1")!, @@ -60,6 +64,7 @@ extension UIOnboardingViewConfiguration { return .init(appIcon: UIOnboardingHelper.setUpIcon(), firstTitleLine: UIOnboardingHelper.setUpFirstTitleLine(), secondTitleLine: UIOnboardingHelper.setUpSecondTitleLine(), + tagline: UIOnboardingHelper.setUpTagline(), features: UIOnboardingHelper.setUpFeatures(), textViewConfiguration: UIOnboardingHelper.setUpNotice(), buttonConfiguration: UIOnboardingHelper.setUpButton()) diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Configuration/UIOnboardingViewConfiguration.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Configuration/UIOnboardingViewConfiguration.swift index d09da65..c2c45b8 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Configuration/UIOnboardingViewConfiguration.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Configuration/UIOnboardingViewConfiguration.swift @@ -11,14 +11,18 @@ struct UIOnboardingViewConfiguration { var appIcon: UIImage var firstTitleLine: NSMutableAttributedString var secondTitleLine: NSMutableAttributedString + var tagline: String? = nil + var taglineColor: UIColor? = nil var features: Array let featureStyle: UIOnboardingFeatureStyle var textViewConfiguration: UIOnboardingTextViewConfiguration? = nil var buttonConfiguration: UIOnboardingButtonConfiguration - + init(appIcon: UIImage, firstTitleLine: NSMutableAttributedString, secondTitleLine: NSMutableAttributedString, + tagline: String? = nil, + taglineColor: UIColor? = nil, features: Array, featureStyle: UIOnboardingFeatureStyle = .init(), textViewConfiguration: UIOnboardingTextViewConfiguration? = nil, @@ -26,6 +30,8 @@ struct UIOnboardingViewConfiguration { self.appIcon = appIcon self.firstTitleLine = firstTitleLine self.secondTitleLine = secondTitleLine + self.tagline = tagline + self.taglineColor = taglineColor self.features = features self.featureStyle = featureStyle self.textViewConfiguration = textViewConfiguration diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingStack.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingStack.swift index 1220d55..3709a8e 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingStack.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingStack.swift @@ -69,10 +69,31 @@ final class UIOnboardingStack: UIStackView { setCustomSpacing(26, after: onboardingIcon) addArrangedSubview(onboardingTitleLabelStack) - setCustomSpacing(traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing(), after: onboardingTitleLabelStack) onboardingTitleLabelStack.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true onboardingTitleLabelStack.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true - + + let titleSpacing: CGFloat = traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing() + if let taglineText = configuration.tagline { + setCustomSpacing(14, after: onboardingTitleLabelStack) + let taglineLabel = UILabel() + taglineLabel.text = taglineText + var taglineFont = UIFont.systemFont(ofSize: 20, weight: .medium) + if let italicDescriptor = taglineFont.fontDescriptor.withSymbolicTraits(.traitItalic) { + taglineFont = UIFont(descriptor: italicDescriptor, size: 20) + } + taglineLabel.font = taglineFont + taglineLabel.textColor = configuration.taglineColor ?? .secondaryLabel + taglineLabel.numberOfLines = 0 + taglineLabel.adjustsFontSizeToFitWidth = true + taglineLabel.minimumScaleFactor = 0.8 + addArrangedSubview(taglineLabel) + taglineLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true + taglineLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true + setCustomSpacing(titleSpacing, after: taglineLabel) + } else { + setCustomSpacing(titleSpacing, after: onboardingTitleLabelStack) + } + addArrangedSubview(featuresList) featuresList.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true featuresList.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/UIOnboardingHelper.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/UIOnboardingHelper.swift index 8364690..1785d6f 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/UIOnboardingHelper.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/UIOnboardingHelper.swift @@ -26,6 +26,10 @@ struct UIOnboardingHelper { ]) } + static func setUpTagline() -> String { + "Know Every Rank" + } + static func setUpFeatures() -> Array { .init([ .init(icon: .init(named: "feature-1"), @@ -59,6 +63,7 @@ extension UIOnboardingViewConfiguration { .init(appIcon: UIOnboardingHelper.setUpIcon(), firstTitleLine: UIOnboardingHelper.setUpFirstTitleLine(), secondTitleLine: UIOnboardingHelper.setUpSecondTitleLine(), + tagline: UIOnboardingHelper.setUpTagline(), features: UIOnboardingHelper.setUpFeatures(), textViewConfiguration: UIOnboardingHelper.setUpNotice(), buttonConfiguration: UIOnboardingHelper.setUpButton()) diff --git a/Demo/UIOnboarding SwiftUI/UIOnboarding SwiftUI/UIOnboardingHelper.swift b/Demo/UIOnboarding SwiftUI/UIOnboarding SwiftUI/UIOnboardingHelper.swift index 649bbab..c68898e 100644 --- a/Demo/UIOnboarding SwiftUI/UIOnboarding SwiftUI/UIOnboardingHelper.swift +++ b/Demo/UIOnboarding SwiftUI/UIOnboarding SwiftUI/UIOnboardingHelper.swift @@ -27,6 +27,10 @@ struct UIOnboardingHelper { ]) } + static func setUpTagline() -> String { + "Know Every Rank" + } + static func setUpFeatures() -> Array { return .init([ .init(icon: .init(named: "feature-1")!, @@ -60,6 +64,7 @@ extension UIOnboardingViewConfiguration { return .init(appIcon: UIOnboardingHelper.setUpIcon(), firstTitleLine: UIOnboardingHelper.setUpFirstTitleLine(), secondTitleLine: UIOnboardingHelper.setUpSecondTitleLine(), + tagline: UIOnboardingHelper.setUpTagline(), features: UIOnboardingHelper.setUpFeatures(), textViewConfiguration: UIOnboardingHelper.setUpNotice(), buttonConfiguration: UIOnboardingHelper.setUpButton())