Skip to content

feat(mobile): dense track rows on catalog lineups behind track_rows - #14700

Merged
dylanjeffers merged 1 commit into
mainfrom
design/mobile-track-rows
Oct 22, 2026
Merged

dylanjeffers merged 1 commit into
mainfrom
design/mobile-track-rows

Conversation

@dylanjeffers

Copy link
Copy Markdown
Contributor

Phase 1 of the redesign on mobile: tracks in catalog lineups render as 64px rows instead of bordered tiles, matching web (#14684-#14690). Gated by the existing track_rows flag, which is on in production, so this reaches RC users through the RC OTA on merge. Feed keeps tiles.

Where: Trending, Underground, profile Tracks and Reposts, search track results. Collections in mixed lineups (Reposts) stay tiles. Library already uses TrackList rows and is unchanged.

Row: optional rank, 48px art, title, artist with badges, duration (or "12m left" / "Played" for podcasts and audiobooks), and a price/unlock button in place of the duration on locked tracks.

  • Tap plays (gated tracks open the purchase modal or locked-content drawer, same as the tile).
  • Long-press opens the track's actions, with a haptic. No kebab: the title gets the space. VoiceOver gets the same menu as a "More options" action.
  • The playing track gets an accent title and an equalizer on its art.

Code:

  • harmony-native/components/TrackRow: presentational row.
  • lineup-tile/TrackRowTile: connected row.
  • lineup-tile/useOpenTrackOverflow: overflow actions now shared by TrackTile and the row (tile menu unchanged). Rows add share, favorite and repost since they have no inline buttons.
  • TrackLineup gets tileVariant: 'tile' | 'row'.

Tested on the iOS 26.5 simulator (1.5.190 Release build with this bundle swapped in), signed in: Trending rows and ranks, tap to play and switch tracks, equalizer, long-press menu without starting playback, pagination to 50, profile Tracks rows, loading skeletons. Not tested: Android, search results, a locked track's price button, VoiceOver.

Mobile tsc and eslint are clean locally (mobile CI only runs security checks).

🤖 Generated with Claude Code

Mobile catalog lineups render tracks as 64px rows instead of bordered
tiles, matching web. Behind the existing track_rows flag; Feed keeps tiles.

- harmony-native TrackRow: optional rank, 48px art, title, artist line,
  duration or a status (price/unlock), and a pressed state. Long-press
  opens the track's actions and is exposed to VoiceOver as an action.
- TrackRowTile: connected row with the tile's play and gated-content
  behavior, an equalizer on the playing track's art, Artist Pick
  context, and podcast time-left labels.
- useOpenTrackOverflow: overflow actions shared by TrackTile and the
  row. Rows add share, favorite and repost since they have no inline
  buttons.
- TrackLineup tileVariant='row'; used on Trending, Underground, profile
  Tracks and Reposts, and search track results.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Oct 22, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d91daff

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@dylanjeffers
dylanjeffers merged commit e84884d into main Oct 22, 2026
3 checks passed
@dylanjeffers
dylanjeffers deleted the design/mobile-track-rows branch October 22, 2026 20:58
dylanjeffers added a commit that referenced this pull request Oct 22, 2026
…animation (#14701)

Follow-up to #14700: the Library catches up with Trending, and rows get
a real press animation.

**Library Tracks tab** (behind `track_rows`, on in production): the
bordered card of art-less rows is replaced by the same `TrackRow`
Trending uses, full-bleed: 48px artwork with the playing overlay, title
with the offline download indicator, artist with badges, duration. Tap
plays, long-press opens the actions (now including favorite/repost/share
since there is no kebab). The flag-off path keeps the old `TrackList`.

**Filter field**: `FilterInput` is a flush search-style pill (surface2,
search icon, clear button) instead of a shadowed Paper card with a
filter icon. Same props, so Albums/Playlists, Listening History, Add to
Collection and the feature-flag screen pick it up too. The client-side
filter and 250 ms server query debounce are unchanged.

**Row press animation** (`TrackRow`, so Trending/profiles/search get it
too): press-in scales the row to 0.985 with a surface2 highlight;
release springs back. A long-press dips to 0.96 and springs back as the
actions open, alongside the existing haptic. Reanimated 4 on the UI
thread; the highlight is an absolute overlay so no color interpolation
through transparent.

**Tested** on the iOS 26.5 simulator (1.5.190 Release build with this
bundle swapped in, signed in): Library rows and artwork, tap to play
with the equalizer overlay, long-press menu, typing a filter and
clearing it, pagination skeletons. Mobile `tsc` and eslint are clean.
Not tested: Android, offline mode with downloaded tracks, VoiceOver.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant