Skip to content

[design-qa][P1] Spacing and radii drift between peers #180

Description

@cestercian

Part of the Sep-2026 designer's-eye QA of the 138 "Artistant iOS Light" screens (theme T17, category spacing; epic #161). Full report with evidence and per-screen coverage: docs/DESIGN_QA_2026-09.md; the per-section appendices under docs/design-qa/ carry the code excerpts.

Why it matters. Peer surface3 cards use four radii (16/18/20/24); insets drift between twin screens; two pinned bars have different tailroom; spacers stack on spacedBy; the tab bar ships 15–39 dp over §2's 88; provider rows are 52 beside a 54 CTA.

Fix direction. One radius per object class, one inset per relationship, one tailroom, and a tab-bar height that matches its own KDoc.

Findings (11: P1 ×1, P2 ×1, P3 ×9)

  • F-GS-13 (P3) — Provider rows are 52 dp beside a 54 dp CTA
    • Screens: 12
    • Where: feature/signup/SignupAuthScreen.kt:322 (dimens.size.ctaTall = 52, Dimens.kt:187); designsystem/component/PrimaryButton.kt:86 (dimens.component.cta = 54, Dimens.kt:223)
    • Fix: .height(dimens.component.cta).
  • F-GS-21 (P3) — Peer surface3 cards use four radii (16 / 18 / 20 / 24)
    • Screens: 118, 27, 13, 30, 11
    • Where: feature/signup/WelcomeScreen.kt:140; feature/signup/CommunityCommitmentScreen.kt:112; feature/signup/NotifPermissionScreen.kt:139; feature/signup/DoneScreen.kt:134; feature/signup/RoleScreen.kt:159
    • Fix: radii.lg on all five (keep xl on 11 only if the markup measures 24).
  • F-DS-17 (P3) — Peer insets drift: header top and list tailroom
    • Screens: 02, 03, 14, 32
    • Where: feature/discover/DiscoverScreen.kt:116-118 (top = space.sm), :195-198 (bottom listTailroom = 56); feature/search/SearchScreen.kt:138-140 (top = space.md), :381-386, :580-583 (bottom contentTailroom + listTailroom = 16 + 56)
    • Fix: One header-top token for tab roots; tab roots share one tailroom expression; pushed lists take listTailroom alone.
  • F-DS-25 (P3) — The result card is surface3 on page with no hairline; the only boxed card in the section
    • Screens: 03
    • Where: feature/search/SearchScreen.kt:666-672
    • Fix: surface fill with a 1dp hairline border, or the Artist-list row anatomy (hairline-separated rows, no box).
  • F-AP-22 (P3) — Spacers stack with spacedBy, and the top of 04 stacks up to three notices with double padding
    • Screens: 04, 100, 103, 50
    • Where: feature/artist/ArtistProfileScreen.kt:381, :391, :406, :417, :463, :499, :1170, :1186; feature/score/ScoreExplainerScreen.kt:212, :234
    • Fix: contentPadding-style top/bottom on the column, no per-child top padding, and one notice slot at the top (self note or failure, the report banner replacing it while active).
  • F-BC-04 (P2) — Two pinned bars with different tailroom; the funnel's dock makes every caller re-pad its actions
    • Screens: 05, 06, 07, 94, 132, 17
    • Where: feature/booking/BookingChrome.kt:171, :186-194 (CtaBar) vs designsystem/component/BottomActionBar.kt:46-53; designsystem/theme/Dimens.kt:197; callers BookingScreen.kt:260, ConfirmedScreen.kt:200, :235, MatchConfirmedScreen.kt
    • Fix: Make CtaBar a thin wrapper over BottomActionBar (one tailroom token, spacedBy(md)) and remove the per-caller padding(top = …).
  • F-BN-19 (P3) — Four radii for three classes of object on one page
    • Screens: 18, 96, 52, 20
    • Where: feature/booking/BookingDetailScreen.kt:546 (card, radii.card 20), :783 and :1271 (cards, radii.buttonLg 16), :1410 and :1428 (buttons, radii.md 12), :1206 (CTA, radii.buttonLg 16); feature/bookings/BookingsScreen.kt:390
    • Fix: cards on radii.lg (18), all buttons on radii.buttonLg (16), and stop using buttonLg for cards.
  • F-AS-14 (P3) — Manage availability pads by 24 and 16; the rest of the section pads by the 20 gutter
    • Screens: 22, 105, 106
    • Where: ManageAvailabilityScreen.kt:105, :187, :300 (space.xl = 24) and :138, :183 (space.lg = 16); Dimens.kt:12, :11, :221
    • Fix: dimens.component.gutter on the prose blocks and the dock.
  • F-AS-20 (P3) — "N waiting" touches the section header it hangs from
    • Screens: 09
    • Where: ArtistHomeScreen.kt:246-257; designsystem/component/SectionHeader.kt:37-40
    • Fix: add a subtitle: String? slot to SectionHeader and pass the count through it.
  • F-SH-22 (P3) — Two pushed SH screens, two tailrooms under the last row
    • Screens: 63, 123
    • Where: feature/system/ActivityScreen.kt:196 (chrome.contentTailroom = 16dp) vs feature/system/HelpCentreScreen.kt:133 (size.listTailroom = 56dp)
    • Fix: one token for "last row to bottom edge on a bar-less pushed screen"; use Spacer(Modifier.height(...)).
  • F-DSYS-05 (P1) — The tab bar's own arithmetic contradicts its KDoc by 24dp; it ships 15–39dp over §2's 88
    • Screens: —
    • Where: designsystem/component/LightTabBar.kt:98-104 (the claim), :190 (the cell), :287-291 (the measurement); tokens at theme/Dimens.kt:406,408,412
    • Fix: pick one — either cut barTopPad/barBottomPad so hairline + pads + 48 + inset lands on the design's band, or keep the 48 cell and correct the KDoc so nobody re-derives the wrong number. Do not leave the file asserting two different heights.

Acceptance

  • Every finding above is closed on the cited lines (or refuted in a comment with the reason).
  • ./gradlew :app:assembleDebug, :app:testDebugUnitTest and :app:lintDevDebug green.
  • The screens listed above walked on the artistant AVD with the debug harness (RELEASE.md §10) and the fix confirmed visually — this audit was code-grounded, not device-walked.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions