chore: align UI with iOS Human Interface Guidelines#11
Merged
Conversation
A sweep of the app's SwiftUI surfaces for HIG and accessibility compliance: - Hard Mode and Block Adult Content use full-width labeled Toggles, so the whole row is the tap target and VoiceOver reads a named switch. - Budget steppers expose an accessibility label and spoken value, so VoiceOver announces the value as it changes. - Empty Rules and App Lists states use ContentUnavailableView. - New Rule preset rows use a disclosure chevron (matching the rule-type rows) instead of a misleading plus.circle.fill — both push the editor. - App-list management rows are full-width tap-to-edit with a chevron; the redundant Edit button is dropped (picker mode keeps it, since a row tap there selects rather than edits). - Sheet close buttons use the .cancellationAction placement. - Onboarding leads with the real app icon (new appearance-aware AppLogo imageset) instead of a generic scissors symbol, and both steps share one title font, icon size, and spacing. - Day-of-week letters shrink to fit at large Dynamic Type sizes instead of clipping, while staying seven-across. UITests updated for the new interactions (coordinate taps on labeled toggles, the suffixed stepper increment button, ContentUnavailableView identifiers, and management row tap-to-edit). All 218 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
A comprehensive UI sweep aligning the app's SwiftUI surfaces with Apple's iOS 26 Human Interface Guidelines and accessibility expectations. Every screen was inspected on an iPhone 17 Pro (iOS 26.4) simulator in light/dark, populated/empty/hard-mode states, and the relevant guidance was pulled in to ground each change. Behavior is unchanged — these are presentation, affordance, and accessibility refinements.
Changes
Accessibility
Toggles instead of a manualHStack+labelsHidden()switch. The whole row is the tap target (≥44 pt) and VoiceOver reads a single named switch.lineLimit(1)+minimumScaleFactor) so they never clip at large Dynamic Type sizes, while the seven circles still fit one row.Consistency & affordances
ContentUnavailableView(centered icon + title + description + action) instead of top-aligned cards.plus.circle.fill— both simply push the editor to confirm..cancellationActionplacement (matchingAppListPickerSheet).Onboarding
AppLogoimage set (light/dark variants) shown as a rounded tile — instead of a genericscissorssymbol.Intentionally unchanged (verified, not assumed)
.confirmationAction/.cancellationAction).Test plan
RunAllTests) — unit + UI.dx:0.92), the suffixed stepper increment button (dailyLimitStepper-Increment),ContentUnavailableViewidentifiers moved to the description element, and management-row tap-to-edit (plus a "locked rows don't open" assertion).🤖 Generated with Claude Code