Repository navigation
chore!: raise the deployment target to iOS 18 - #15
Conversation
dashwallet-ios, the only consumer, has been iOS 18 for a while: its Podfile says `platform :ios, '18.0'` and every shipping build configuration of the `dashwallet` and `dashpay` targets — the two that link this package — is 18.0. Nothing has needed the iOS 14 floor for some time, and holding it costs a fallback path in every component that wants an API newer than 2020. macOS is declared alongside it at 15. The package never declared a macOS platform at all, so a macOS build fell back to the SwiftPM default and every type had to carry `@available(macOS 11)` by hand to compile there. Saying it once in the manifest replaces all of that. The `Hard constraint` section in CLAUDE.md is replaced by the new rule: do not annotate for anything at or below the floor, and gate only what is genuinely newer — as `selfSizingSheet` still does for iOS 26 corner styling. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every branch here existed to keep a component running below the old floor, and each one was a second implementation that nobody could see fail: - `SearchBar` dispatched between a focus-driven bar and `SearchBarLegacy`, a whole second bar without the cancel animation. The legacy one is gone and the shell renders the focused bar directly. - `SearchBar` and `AddressFieldView` each carried a pre-iOS 17 `TextField` without a styled prompt — and, in the address field, without the vertical axis that gives it its two-line read-out. - `DashSwitch` fell back to `accentColor`, `NavigationBarButtonStyle` to the value-less `animation(_:)` — the one that animates every change in the view, not just the press. - `SwitchView` reported `.isButton` instead of `.isToggle` to VoiceOver. - `BottomSheet` had the `isModalInPresentation` shim added for iOS 14 last week, and `selfSizingSheet` returned `self` unmodified below iOS 16 — a self-sizing sheet that did not self-size. The `#unavailable(iOS 26.0)` check stays: that one is genuinely above the floor. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`onChange(of:perform:)` was deprecated in iOS 17 / macOS 14. It stayed because the old floor made the replacement unavailable; declaring the macOS platform surfaced it as three build warnings. The package builds warning-free again. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The panel was a fully rounded rectangle pushed below its own frame by the corner radius so its bottom corners fell off screen, with a comment explaining that the shape saying this in one line was iOS 16 and the library shipped to 14. It no longer does, so the workaround goes and the shape says what it draws. Rendered before and after in the simulator, light and dark: identical. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
200 `@available` lines across 48 files, every one of them at or below the declared floor: `iOS 14 / macOS 11` on nearly every public type, `macOS 10.15` on the Foundation-level token types, `iOS 17 / macOS 14` on each `#Preview`. The manifest states the minimum once, so repeating a lower one per declaration only invited the question of which is true. Also folds in the last two deprecated `onChange(of:perform:)` call sites, in `BottomSheet` and `SearchBar`. They sit in UIKit-only paths, so the macOS build of the previous commit could not see them; the iOS simulator build did. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every component page opened with the `@available` line the type used to carry, and the prose recorded which feature lit up on which release — a SearchBar paragraph for the iOS 14 bar that no longer exists, a self-sizing sheet described as a no-op below iOS 16, swipe blocking split across two APIs. None of it is true at an iOS 18 floor, and none of it was worth restating per page now that the manifest says it once. `ScrollViewWithOnScrollChanged` keeps its page but says plainly that it predates `onScrollGeometryChange` and that new code can use the system API. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configuration
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
Eight PRs landed on master since this branch was cut (#16–#23). Their new files came with the old floor's annotations and two fallback branches, which this merge brings onto the iOS 18 floor the same way the earlier commits did for everything else: - `@available(iOS 14, macOS 11)` / `(iOS 17, macOS 14)` dropped from `Criteria`, `SimpleSelect`, `List8View` and the `NavigationBarCircle*` / `NavigationBarButton` files, previews included. - `NavigationBarButtonStyle` moved to `NavigationBarButton.swift` on master; the branch's copy in `NavigationBar.swift` is gone and the moved one uses `animation(_:value:)` unconditionally. - `NavigationBarCircleMenu` always takes the bar's button style — the pre-16 branch that dimmed the menu by hand is gone, and with it the unused `isEnabled`. - `AddressFieldView`'s two new focus mirrors use the two-parameter `onChange`. - The three new doc pages lose their `@available` line, and the circle-menu paragraph its "On iOS 16+". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found by the local review passes over the whole PR: - `SearchBar` is one type again. The public shell only existed to choose between the focused bar and the legacy one. - `BottomSheetDismissalModifier` had become a one-line wrapper around `interactiveDismissDisabled`. The call site now uses the modifier directly and keeps a comment on why the flag is passed rather than branched on. - `TransactionView`, plus the `LocationReader` and `ScrollViewWithOnScrollChanged` previews, use `overlay(alignment:content:)`. The comment pinning `TransactionView` to the iOS 14 target is gone. - The `as Color?` casts that selected the iOS 15 `tint` overload are gone, and the rewritten address field uses `autocorrectionDisabled()`. - `NumericKeyboardView` drops a `.top` background alignment. It only mattered for the old shape that overhung its frame. - Stale comments are fixed in `ScrollViewWithOnScrollChanged` (wrong release for `onScrollGeometryChange`) and `SheetFeature` (a macOS 13 reason). - `docs/buttons-and-inputs.md` said the address field takes 1–3 lines; the code limits it to 1–2. - CLAUDE.md says "up to iOS 18". Its rule no longer suggests annotating a declaration and also gating it in the body. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@coderabbitai review |
✅ Action performedReview finished.
|
Issue being fixed or feature implemented
dashwallet-ios is an iOS 18 app —
platform :ios, '18.0'in its Podfile, and 18.0 on everyshipping build configuration of the
dashwalletanddashpaytargets, the two that linkthis package. This library was still declaring iOS 14, so every component that wanted an API
newer than 2020 carried a second implementation for hosts that no longer exist: a whole
alternative
SearchBar, single-line text fields without a styled prompt, a self-sizing sheetthat did not self-size, a
SwitchViewthat told VoiceOver it was a button.What was done?
The floor —
Package.swiftnow declares.iOS(.v18)and, for the first time,.macOS(.v15). The package never declared macOS at all, so a macOS build fell back to theSwiftPM default and every type had to carry
@available(macOS 11)by hand to compile there.Fallback paths removed —
SearchBar(theSearchBarLegacybar and the pre-17 field),AddressFieldView(pre-17 single-line field),DashSwitch(accentColor),NavigationBarButtonStyle(the value-lessanimation(_:), which animates every change inthe view rather than just the press),
SwitchView(.isButtoninstead of.isToggle),BottomSheet(theisModalInPresentationshim, andselfSizingSheetreturningselfbelow iOS 16). The
#unavailable(iOS 26.0)check inselfSizingSheetstays, because that onereally is above the floor.
Deprecations cleared — five
onChange(of:perform:)call sites move to the two-parameterform. They were deprecated in iOS 17 but the replacement was unavailable at the old floor;
declaring the macOS platform surfaced three of them as warnings, and the iOS build the other
two. The package now builds warning-free for both platforms.
NumericKeyboardView— the panel was a fully rounded rectangle pushed below its ownframe so its bottom corners fell off screen, with a comment explaining why the shape that
says this in one line was out of reach. It is an
UnevenRoundedRectanglenow.Annotations — 200
@availablelines across 48 files, all at or below the declared floor,are gone. The manifest states the minimum once.
Brought up to date with master — since this branch was cut, #16–#23 merged. Master is
merged in (no rebase, no force-push). The files those PRs added (
Criteria,SimpleSelect,List8View,NavigationBarCircle*,NavigationBarButton) are on the same floor now: noannotations, and the two
#availablebranches inNavigationBarCircleMenuandNavigationBarButtonStyleare gone.Smaller cleanups the floor allows —
SearchBaris a single type again. Its public shellexisted only to switch between the focused bar and the legacy one. The one-line
BottomSheetDismissalModifieris inlined.TransactionViewusesoverlay(alignment:content:), as do two previews. Theas Color?casts that picked the iOS 15tintoverload are gone. The rewritten address field usesautocorrectionDisabled(). Stalecomments that named old releases are fixed.
Docs —
CLAUDE.md's hard-constraint section is replaced by the new rule (don't annotateat or below the floor; gate only what is newer). Component pages no longer restate an
@availableline each, and the prose that recorded which feature lit up on which release iseither gone or now true.
How Has This Been Tested?
swift buildandswift testclean on macOS (16 tests), andxcodebuild build-for-testingclean for the iOS Simulator — no errors, no warnings on either.
generic/platform=iOS) is clean too.NumericKeyboardViewrendered in the simulator before and after the shape change, light anddark: identical when the keyboard sits on the bottom edge.
public/opendeclarations are identical.Every declaration that was removed was private (
SearchBarLegacy,LegacyInteractiveDismissModifier,ModalInPresentationSetter,toggleTrait).dashwallet-ios
developuses no removed symbol.Breaking Changes
Yes — this raises the minimum deployment target to iOS 18 / macOS 15. Any host below that
can no longer link the package. dashwallet-ios is the only consumer and is already there, with
one exception worth fixing before this merges:
The
Testnetconfiguration of thedashpaytarget was the one exception at 17.0. It was movedto 18.0 in dashpay/dashwallet-ios#1081, so every configuration on
developis 18.0 now.Release tag: this must ship as 2.0.0, not 1.x. The frozen
masterof dashwallet-ios isstill iOS 15 and pins DashUIKit with
upToNextMajorfrom 1.0.0. A 1.x tag cut after this mergewould break it on the next resolve.
developtracks themasterbranch of this repo, so itpicks the change up directly.
No API was removed or renamed: every public type, initialiser and parameter is unchanged, and
the components behave as they already did on iOS 18 hosts.
One visible change: the
NumericKeyboardViewpanel used to be a fully rounded rectangle pushed32pt below its own frame. A host that placed the keyboard away from the bottom edge saw that
32pt strip under the keys. The panel now ends at its frame and still runs into the bottom safe
area. dashwallet-ios has eight call sites, all going through
HardwareNumericKeyboardView:send, specify amount, internal transfer, Coinbase transfer, DashSpend (two), Evonode withdrawal
and the contact profile sheet. Each one should get a quick visual check against this branch.
Follow-ups, deliberately left out of this PR:
BottomSheetstill usespresentationMode,NavigationViewandnavigationBarHidden.Swapping them can change how the sheet lays out, so it needs its own visual check.
ScrollViewWithOnScrollChangedcould move ontoonScrollGeometryChangeor bedeprecated. It is public API.
SearchBartyped-text styling andSwitchViewVoiceOver traits. Both predate this PR,because iOS 18 already ran these paths.
foregroundColor/cornerRadius/overlay(_:alignment:)across the library.Checklist:
🤖 Generated with Claude Code
Summary by CodeRabbit
Platform Support
Improvements
Documentation