Lower the iOS deployment floor: iOS 17 → iOS 15.6 (macOS stays 14)
The whole package (Core + ThemeKit + Travel) now compiles clean at the iOS 15.6 floor — 0 availability errors. Additive for existing 17+ consumers (the support matrix only widens). Implements ADR-0007; merged in #342.
⚠️ Migration (minor — two recorded exceptions)
- Compile-time: reading a presenter via the object environment no longer compiles —
@Environment(SheetPresenter.self)(andDrawerPresenter/FeedbackPresenter) →@EnvironmentObject. - SILENT runtime — check every owned instance:
@Stateon a presenter orFormValidatorstill compiles but stops updating views → replace with@StateObject(SheetPresenter,DrawerPresenter,FeedbackPresenter,TourController,UploadController,FormValidator). This is the sharpest edge — grep your code for@Statenext to those six types. ThemeKitCalendaradd-on now requires iOS 17+ (itsAlmanac/HorizonCalendardependency declares an iOS-17 floor; SwiftPM can't elevate one target above the package floor). The dependency-free core and every other add-on/edition support 15.6; theCalendartrait defaults off, so default resolution is unaffected.
Unchanged: @Environment(\.theme), .themeKit(), .theme(_:) per-subtree overrides, and every component's public API.
What changed under the hood
- Core observation
@Observable→ObservableObject/@Published(Observation doesn't back-deploy below 17); per-subtree theming, the.id(revision)rebuild, and the live language switch preserved and test-pinned. - Reimplementations behind unchanged public APIs (single-path, every OS): Charts →
Canvas/Path(render-visible), customLayout(FlowLayout/Masonry/Flex) → measured,ViewThatFits→AdaptiveFit,Grid→ rows (BoardingPass),Gauge→ ring/bar,LocationCardmap,KanbanBoarddrag-drop, ticket-notch → arc geometry. New CoreShapepolyfillsThemeAnyShape/ThemeUnevenRoundedRect. - Graceful-degrade (named, directly-tested legacy branches) for pure-polish iOS-16/17 API: sheet
presentationDetents,ShareLink,.symbolEffect, scroll-target snapping,.onKeyPress. - Demo app migrated to the floor (deployment target 15.6, builds & deep-link verified).
- CI: advisory
ios-floorcompile-floor canary lane (ADR-0007 §D5 — the compiler is the airtight 15.6 guardrail since no iOS 15 sim runtime exists under the tools-6.2 toolchain).
Verification
swift build clean · swift test 366 (macOS) + 462 (iOS sim), 0 failures · full-package floor canary 0 availability errors · all CI gates green on #342 (incl. the iOS 15.6 floor canary). check-api clean (31 breakages, all allowlisted — FlowLayout Layout-conformance removal, presenter Observable removals, incidental Charts Array conformances).
Install
.package(url: "https://github.com/isamercan/ThemeKit.git", from: "1.3.0"),📄 Full detail in the CHANGELOG.