Add AppStorage support for Date and Date? types (fixes #34)#36
Add AppStorage support for Date and Date? types (fixes #34)#36
Conversation
📝 WalkthroughWalkthroughAdds AppStorage initializers for Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~40 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #36 +/- ##
========================================
+ Coverage 0.00% 3.59% +3.59%
========================================
Files 24 24
Lines 351 362 +11
========================================
+ Hits 0 13 +13
+ Misses 351 349 -2
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI Agents
In @CLAUDE.md:
- Line 7: The opening platform-version sentence ("iOS 15+, macOS 12+, tvOS 15+,
watchOS 8+, visionOS 1+") is out of sync with the Platform Support section and
Package.swift; update that sentence to exactly match the deployment target
versions declared in the Platform Support section and Package.swift (use the
exact iOS, macOS, tvOS, watchOS, and visionOS version numbers from those
sources) so the README and package metadata are consistent.
In @Package.swift:
- Around line 32-39: Remove the now-redundant @available(macOS 14.0, iOS 17.0,
watchOS 10.0, tvOS 17.0, *) annotations in SetupPublishers.swift (there are
three occurrences) because Package.swift raises the package minimums to iOS 18 /
macOS 15 / tvOS 18 / watchOS 11 / visionOS 2; delete those attribute lines from
the relevant functions/types (the three annotated declarations) and ensure no
follow-up conditional code depends on those availability checks.
🧹 Nitpick comments (2)
CLAUDE.md (1)
124-132: Consider adding a language identifier to the code block.The ASCII diagram could use a language identifier like
textorplaintextto satisfy markdown linting (MD040).🔎 Suggested fix
-``` +```text RadiantKit (foundation) ↑ ↑ | | | | RadiantDocs RadiantPaging RadiantProgress (independent) ```Tests/RadiantKitTests/AppStorageDateTests.swift (1)
66-70: Consider using#requirefor cleaner early exit.The
guard/Issue.record/returnpattern can be simplified with Swift Testing's#requiremacro, which throws on failure and removes the need for explicit early return.🔎 Suggested fix
- guard let store = UserDefaults(suiteName: #function) else { - Issue.record("Failed to create UserDefaults") - return - } + let store = try #require(UserDefaults(suiteName: #function))This pattern can be applied to all test methods in this file.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
CLAUDE.mdPackage.swiftScripts/lint.shSources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+AppStored.swiftSources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+ExpressibleByNilLiteral.swiftSources/RadiantKit/Views/ValueTextBubble.swiftTests/RadiantKitTests/AppStorageDateTests.swift
💤 Files with no reviewable changes (1)
- Sources/RadiantKit/Views/ValueTextBubble.swift
🧰 Additional context used
🧬 Code graph analysis (1)
Package.swift (1)
Sources/RadiantProgress/SetupPublishers.swift (3)
macOS(45-75)macOS(84-103)macOS(112-137)
🪛 LanguageTool
CLAUDE.md
[uncategorized] ~197-~197: The official name of this software platform is spelled with a capital “H”.
Context: ...Add corresponding test target 5. Update .github/workflows/RadiantKit.yml if platform-s...
(GITHUB)
🪛 markdownlint-cli2 (0.18.1)
CLAUDE.md
98-98: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
103-103: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
108-108: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
113-113: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
118-118: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
124-124: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🔇 Additional comments (4)
Scripts/lint.sh (1)
47-48: LGTM — hardcoded year appears intentional.The
-y 2025flag hardcodes the copyright year. If dynamic year generation is preferred in the future, consider using$(date +%Y).Sources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+ExpressibleByNilLiteral.swift (1)
139-155: LGTM — Consistent with existing optional type initializers.The new
Date?initializer follows the established pattern used forBool?,Int?,Double?,String?,URL?, andData?. The constraints and delegation are correct.Tests/RadiantKitTests/AppStorageDateTests.swift (1)
61-220: LGTM — Comprehensive test coverage for Date and Date? storage.The test suite covers:
- Non-optional and optional
Datestorage- Value updates and persistence verification
- Both
.describingand.reflectingkey types- Setting optional values to
nilGood use of isolated
UserDefaultssuites with proper cleanup viadefer.Sources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+AppStored.swift (1)
145-161: LGTM — Consistent with existing non-optional type initializers.The new
Dateinitializer follows the established pattern used forBool,Int,Double,String,URL, andData. The constraints, delegation, and documentation are correct.
| platforms: [ | ||
| .iOS(.v15), | ||
| .macCatalyst(.v15), | ||
| .macOS(.v12), | ||
| .tvOS(.v15), | ||
| .visionOS(.v1), | ||
| .watchOS(.v8) | ||
| .iOS(.v18), | ||
| .macCatalyst(.v18), | ||
| .macOS(.v15), | ||
| .tvOS(.v18), | ||
| .visionOS(.v2), | ||
| .watchOS(.v11) | ||
| ], |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
AppStorage Date value support SwiftUI iOS macOS version requirements
💡 Result:
Short answer:
- Native Date support in @AppStorage was added in SwiftUI for iOS 18 / macOS 15 (and corresponding tvOS/watchOS/visionOS versions). Use @available(iOS 18.0, macOS 15.0, ...) when using @AppStorage with Date. [1]
Before those OS SDKs:
- @AppStorage does NOT natively accept Date; typical workarounds are: store a TimeInterval/Double shadow value, make Date conform to RawRepresentable (String/Int) or encode to Data/String, or use a custom Converter wrapper. [2][3]
Sources
- Swift forums thread noting the new Date initializer and availability (iOS 18 / macOS 15). [1]
- Community guides showing pre-iOS‑18 workarounds (shadow Double, RawRepresentable, string/ISO8601 or JSON encoding). [2][3]
🏁 Script executed:
# Check SetupPublishers.swift for the @available annotations mentioned
fd "SetupPublishers.swift" --type fRepository: brightdigit/RadiantKit
Length of output: 111
🏁 Script executed:
wc -l "Sources/RadiantProgress/SetupPublishers.swift"Repository: brightdigit/RadiantKit
Length of output: 115
🏁 Script executed:
sed -n '40,50p;80,90p;108,118p' "Sources/RadiantProgress/SetupPublishers.swift"Repository: brightdigit/RadiantKit
Length of output: 1464
Breaking change: Platform minimums significantly raised to support native Date storage in AppStorage.
Apple added native Date support to AppStorage in iOS 18, macOS 15 (and corresponding versions for tvOS 18, watchOS 11, visionOS 2). The platform version bumps in Package.swift are required to use this feature.
The @available(macOS 14.0, iOS 17.0, watchOS 10.0, tvOS 17.0, *) annotations in Sources/RadiantProgress/SetupPublishers.swift (lines 44, 83, 111) are now redundant since the package minimum exceeds those versions and can be safely removed.
🤖 Prompt for AI Agents
In @Package.swift around lines 32 - 39, Remove the now-redundant
@available(macOS 14.0, iOS 17.0, watchOS 10.0, tvOS 17.0, *) annotations in
SetupPublishers.swift (there are three occurrences) because Package.swift raises
the package minimums to iOS 18 / macOS 15 / tvOS 18 / watchOS 11 / visionOS 2;
delete those attribute lines from the relevant functions/types (the three
annotated declarations) and ensure no follow-up conditional code depends on
those availability checks.
Implements issue #34 by adding native Date support to AppStorage extensions. Bumps minimum deployment targets to iOS 18/macOS 15 to leverage SwiftUI's native Date storage capabilities. - Add Date initializer to AppStorage+AppStored - Add Date? initializer to AppStorage+ExpressibleByNilLiteral - Update minimum deployment targets across all platforms - Remove obsolete iOS 15.0 availability annotation - Add comprehensive test coverage for Date storage - Update lint script to use hardcoded 2025 year 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
d5fd58b to
d29f5e8
Compare
Pull Request ReviewThis PR adds native ✅ StrengthsCode Quality
Test Coverage
Architecture
|
Lower minimum macOS deployment target from v15 to v12 while maintaining support for newer features through conditional availability. Changes: - Package.swift: Set macOS minimum to v12 (was v15) - CLAUDE.md: Update platform support documentation - AppStorage Date support: Add @available guards for macOS 15+ features - AppStorage+AppStored.swift: Guard Date initializer - AppStorage+ExpressibleByNilLiteral.swift: Guard Date? initializer - AppStorageDateTests.swift: Restructure with runtime availability checks - Tests now record issues on unsupported platforms instead of failing - Each test body includes #if canImport(SwiftUI) and #available checks - Remove placeholder RadiantKitTests.swift file All existing @available guards from commit c18df55 remain in place for macOS 13+ and macOS 14+ APIs. Package compiles and tests pass. [skip ci] 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Package.swift (1)
32-39: Critical: macOS deployment target must be v15, not v12.Line 35 sets the macOS minimum to v12, but the PR objectives, coding guidelines, learnings, and the technical requirement for native
Datesupport inAppStorageall mandate macOS 15.0. NativeDatestorage inAppStoragewas introduced in iOS 18 / macOS 15, and setting macOS to v12 will cause compilation failures when using the newAppStorageinitializers forDateandDate?added in this PR.🔎 Proposed fix
platforms: [ .iOS(.v18), .macCatalyst(.v18), - .macOS(.v12), + .macOS(.v15), .tvOS(.v18), .visionOS(.v2), .watchOS(.v11) ],Based on coding guidelines and learnings.
🧹 Nitpick comments (1)
Tests/RadiantKitTests/AppStorageDateTests.swift (1)
62-62: Optional: Consider extracting helper methods to address SwiftLint length warnings.SwiftLint reports warnings for file length (278>250), type body length (180>125), and function body length (26>25 in
testOptionalDateSetToNil). These are due to necessary platform guards and error handling boilerplate across 8 tests.The current structure is clear and maintainable. Extracting the platform guard pattern into a helper could reduce duplication, but may add complexity. Given that all tests pass and the code is readable, this refactor is low priority.
Also applies to: 214-214
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (8)
CLAUDE.mdPackage.swiftScripts/lint.shSources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+AppStored.swiftSources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+ExpressibleByNilLiteral.swiftSources/RadiantKit/Views/ValueTextBubble.swiftTests/RadiantKitTests/AppStorageDateTests.swiftTests/RadiantKitTests/RadiantKitTests.swift
💤 Files with no reviewable changes (2)
- Tests/RadiantKitTests/RadiantKitTests.swift
- Sources/RadiantKit/Views/ValueTextBubble.swift
🚧 Files skipped from review as they are similar to previous changes (3)
- CLAUDE.md
- Scripts/lint.sh
- Sources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+ExpressibleByNilLiteral.swift
🧰 Additional context used
📓 Path-based instructions (3)
**/*.swift
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.swift: All source files must include copyright headers (managed by Scripts/header.sh)
Use swift-format (v600.0.0) with configuration in .swift-format for code formatting
Use SwiftLint (v0.58.0) with rules in .swiftlint.yml for Swift style validation
All UI components must be @mainactor isolated for thread safety
Closures crossing actor boundaries must be @sendable
Use nonisolated sparingly and only when necessary in @MainActor-isolated types
All code must be compatible with Swift 6.0 strict concurrency checking and Sendable requirements
Protocols should use descriptive nouns (e.g., CodablePackage, ProgressOperation) for naming
Generic type parameters should use full words (e.g., FileType, ValueType) instead of single letters
Environment keys should follow the pattern Key (e.g., NextPageKey, PreviousPageKey)
Platform-specific code should use #if canImport() or #if os() directives
Use AppStored protocol for key-based storage contracts in property wrappers
Use DefaultWrapped for property wrappers that extend AppStored with default value support
Use UserDefaults extensions for type-safe retrieval in AppStored implementations
Use DocumentFile for type-safe file handling where FileType conforms to FileTypeSpecification
Use ProgressOperation protocol for progress-reporting operations where ValueType conforms to BinaryInteger & Sendable
Use @observable macro for reactive state (requires iOS 17+)
Inject page navigation actions (NextPageAction, PreviousPageAction, CancelPageAction) via SwiftUI environment
Use interface segregation with small, focused protocols rather than large monolithic protocols
Use protocol extensions to provide shared functionality across conforming types
Use generic constraints for type safety to prevent runtime errors
Files:
Sources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+AppStored.swiftPackage.swiftTests/RadiantKitTests/AppStorageDateTests.swift
Package.swift
📄 CodeRabbit inference engine (CLAUDE.md)
Package.swift: Minimum deployment target for iOS is 18.0 / iPadOS 18.0
Minimum deployment target for macOS is 15.0
Minimum deployment target for tvOS is 18.0
Minimum deployment target for watchOS is 11.0
Minimum deployment target for visionOS is 2.0
Minimum deployment target for Mac Catalyst is 18.0
New modules must be added to Package.swift products and targets arrays
New modules must apply swiftSettings for experimental features in Package.swift
New modules must have corresponding test targets defined in Package.swift
Enable AccessLevelOnImport experimental feature in swiftSettings
Enable BitwiseCopyable experimental feature in swiftSettings
Enable IsolatedAny experimental feature in swiftSettings
Enable MoveOnlyPartialConsumption experimental feature in swiftSettings
Enable NestedProtocols experimental feature in swiftSettings
Enable NoncopyableGenerics experimental feature in swiftSettings
Enable TransferringArgsAndResults experimental feature in swiftSettings
Enable VariadicGenerics experimental feature in swiftSettings
Files:
Package.swift
Tests/**/*.swift
📄 CodeRabbit inference engine (CLAUDE.md)
Tests must pass on both macOS and Linux platforms (note: RadiantProgress uses swift-log on Linux)
Files:
Tests/RadiantKitTests/AppStorageDateTests.swift
🧠 Learnings (16)
📓 Common learnings
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to **/*.swift : Use UserDefaults extensions for type-safe retrieval in AppStored implementations
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to **/*.swift : Use UserDefaults extensions for type-safe retrieval in AppStored implementations
Applied to files:
Sources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+AppStored.swiftPackage.swiftTests/RadiantKitTests/AppStorageDateTests.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to **/*.swift : Use DefaultWrapped for property wrappers that extend AppStored with default value support
Applied to files:
Sources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+AppStored.swiftPackage.swiftTests/RadiantKitTests/AppStorageDateTests.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to **/*.swift : Use AppStored protocol for key-based storage contracts in property wrappers
Applied to files:
Sources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+AppStored.swiftPackage.swiftTests/RadiantKitTests/AppStorageDateTests.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : Minimum deployment target for macOS is 15.0
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : Minimum deployment target for visionOS is 2.0
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : Minimum deployment target for Mac Catalyst is 18.0
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : Minimum deployment target for iOS is 18.0 / iPadOS 18.0
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : Minimum deployment target for watchOS is 11.0
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : Minimum deployment target for tvOS is 18.0
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : New modules must be added to Package.swift products and targets arrays
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : New modules must have corresponding test targets defined in Package.swift
Applied to files:
Package.swiftTests/RadiantKitTests/AppStorageDateTests.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : Enable VariadicGenerics experimental feature in swiftSettings
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Package.swift : Enable AccessLevelOnImport experimental feature in swiftSettings
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to **/*.swift : Use Observable macro for reactive state (requires iOS 17+)
Applied to files:
Package.swift
📚 Learning: 2026-01-06T23:25:31.843Z
Learnt from: CR
Repo: brightdigit/RadiantKit PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T23:25:31.843Z
Learning: Applies to Tests/**/*.swift : Tests must pass on both macOS and Linux platforms (note: RadiantProgress uses swift-log on Linux)
Applied to files:
Tests/RadiantKitTests/AppStorageDateTests.swift
🪛 GitHub Check: CodeFactor
Tests/RadiantKitTests/AppStorageDateTests.swift
[notice] 214-214: Tests/RadiantKitTests/AppStorageDateTests.swift#L214
Function body should span 25 lines or less excluding comments and whitespace: currently spans 26 lines (function_body_length)
[notice] 62-62: Tests/RadiantKitTests/AppStorageDateTests.swift#L62
Struct body should span 125 lines or less excluding comments and whitespace: currently spans 180 lines (type_body_length)
[notice] 278-278: Tests/RadiantKitTests/AppStorageDateTests.swift#L278
File should contain 250 lines or less: currently contains 278 (file_length)
🪛 SwiftLint (0.57.0)
Tests/RadiantKitTests/AppStorageDateTests.swift
[Warning] 278-278: File should contain 250 lines or less: currently contains 278
(file_length)
[Warning] 214-214: Function body should span 25 lines or less excluding comments and whitespace: currently spans 26 lines
(function_body_length)
[Warning] 62-62: Type body should span 125 lines or less excluding comments and whitespace: currently spans 180 lines
(type_body_length)
🔇 Additional comments (3)
Tests/RadiantKitTests/AppStorageDateTests.swift (2)
39-57: LGTM! Test types provide comprehensive coverage.The test storage types correctly conform to
AppStoredand cover all necessary combinations: non-optional/optional Date with describing/reflecting key types.
66-275: Comprehensive test coverage with proper isolation.The test suite thoroughly validates Date and Date? AppStorage behavior with:
- Proper test isolation via unique UserDefaults suites
- Correct platform guards and version checks
- Cleanup using
deferto prevent test pollution- Both
.describingand.reflectingkey types- Nil handling for optional Date
The repetitive platform guard boilerplate is necessary for backward compatibility.
Sources/RadiantKit/PropertyWrappers/AppStorage/AppStorage+AppStored.swift (1)
145-162: Looks good! The@availableannotation is correct.The initializer properly follows the established pattern for type-specific AppStorage initializers and correctly delegates to the base initializer via
type.key. The platform availability annotation (macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, visionOS 2.0) matches the actual minimum versions required for native Date storage in AppStorage.
Summary
DateandDate?typesChanges
AppStorage Extensions
Dateinitializer inAppStorage+AppStored.swiftfor non-optional Date storage with wrapped valuesDate?initializer inAppStorage+ExpressibleByNilLiteral.swiftfor optional Date storageDeployment Target Updates
Updated minimum platform versions in
Package.swift:Tests
Added
AppStorageDateTests.swiftwith 8 comprehensive tests:.describingand.reflectingkey typesCleanup
@available(iOS 15.0, *)annotation fromValueTextBubble.swift-y 2025parameter for consistent copyright yearsCLAUDE.mddocumentation with new platform requirementsBreaking Changes
Test Plan
Example Usage
Fixes #34
🤖 Generated with Claude Code
Perform an AI-assisted review on
Summary by CodeRabbit
Platform Support Changes
New Features / Improvements
Tests
Chores
✏️ Tip: You can customize this high-level summary in your review settings.