Skip to content

Commit 55bfc54

Browse files
authored
fix(suggested-tracks): row hover + full-row play click target (#14426)
1 parent 12c9414 commit 55bfc54

2 files changed

Lines changed: 68 additions & 17 deletions

File tree

packages/web/src/components/suggested-tracks/SuggestedTracks.module.css

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,22 @@
4040
justify-content: space-between;
4141
padding: var(--harmony-unit-4);
4242
gap: var(--harmony-unit-3);
43+
cursor: pointer;
44+
transition: background-color var(--harmony-quick);
45+
}
46+
47+
.suggestedTrack:hover,
48+
.suggestedTrack:focus-visible {
49+
background-color: var(--harmony-n-50);
50+
}
51+
52+
.suggestedTrack:focus {
53+
outline: none;
54+
}
55+
56+
.suggestedTrack:focus-visible {
57+
outline: 2px solid var(--harmony-focus, var(--harmony-secondary));
58+
outline-offset: -2px;
4359
}
4460

4561
.trackDetails {
@@ -55,10 +71,8 @@
5571
border: 0.5px solid var(--harmony-n-100);
5672
}
5773

58-
.artworkButton {
59-
all: unset;
74+
.artworkWrapper {
6075
position: relative;
61-
cursor: pointer;
6276
height: var(--harmony-unit-10);
6377
width: var(--harmony-unit-10);
6478
flex-shrink: 0;
@@ -74,14 +88,19 @@
7488
background: rgba(0, 0, 0, 0.4);
7589
opacity: 0;
7690
transition: opacity var(--harmony-quick);
91+
pointer-events: none;
7792
}
7893

79-
.artworkButton:hover .playOverlay,
80-
.artworkButton:focus-visible .playOverlay,
94+
.suggestedTrack:hover .playOverlay,
95+
.suggestedTrack:focus-visible .playOverlay,
8196
.playOverlay.isPlaying {
8297
opacity: 1;
8398
}
8499

100+
.userLinkWrapper {
101+
display: inline-flex;
102+
}
103+
85104
.trackInfo {
86105
display: flex;
87106
flex-direction: column;
@@ -139,4 +158,9 @@
139158
.suggestedTrackSkeleton {
140159
composes: suggestedTrack;
141160
height: 72px;
161+
cursor: default;
162+
}
163+
164+
.suggestedTrackSkeleton:hover {
165+
background-color: transparent;
142166
}

packages/web/src/components/suggested-tracks/SuggestedTracks.tsx

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useMemo } from 'react'
1+
import { KeyboardEvent, MouseEvent, useCallback, useMemo } from 'react'
22

33
import {
44
SUGGESTED_TRACK_COUNT,
@@ -79,38 +79,65 @@ const SuggestedTrackRow = (props: SuggestedTrackProps) => {
7979
onAddTrack(track_id)
8080
}, [onAddTrack, track_id])
8181

82+
const handleRowKeyDown = useCallback(
83+
(e: KeyboardEvent<HTMLDivElement>) => {
84+
if (e.key === 'Enter' || e.key === ' ') {
85+
e.preventDefault()
86+
togglePlay()
87+
}
88+
},
89+
[togglePlay]
90+
)
91+
92+
const handleAddClick = useCallback(
93+
(e: MouseEvent<HTMLButtonElement>) => {
94+
e.stopPropagation()
95+
handleAddTrack()
96+
},
97+
[handleAddTrack]
98+
)
99+
82100
return (
83-
<div className={styles.suggestedTrack}>
101+
<div
102+
className={styles.suggestedTrack}
103+
role='button'
104+
tabIndex={0}
105+
aria-label={isTrackPlaying ? `Pause ${title}` : `Play ${title}`}
106+
onClick={togglePlay}
107+
onKeyDown={handleRowKeyDown}
108+
>
84109
<div className={styles.trackDetails}>
85-
<button
86-
type='button'
87-
className={styles.artworkButton}
88-
onClick={togglePlay}
89-
onMouseDown={(e) => e.preventDefault()}
90-
aria-label={isTrackPlaying ? `Pause ${title}` : `Play ${title}`}
91-
>
110+
<div className={styles.artworkWrapper}>
92111
<Image className={styles.trackArtwork} src={image} />
93112
<span
94113
className={cn(styles.playOverlay, {
95114
[styles.isPlaying]: isTrackPlaying
96115
})}
116+
aria-hidden='true'
97117
>
98118
{isTrackPlaying ? (
99119
<IconPause size='s' color='staticWhite' />
100120
) : (
101121
<IconPlay size='s' color='staticWhite' />
102122
)}
103123
</span>
104-
</button>
124+
</div>
105125
<div className={styles.trackInfo}>
106126
<p className={styles.trackName}>{title}</p>
107-
{user ? <UserLink userId={user.user_id} size='s' /> : null}
127+
{user ? (
128+
<span
129+
className={styles.userLinkWrapper}
130+
onClick={(e) => e.stopPropagation()}
131+
>
132+
<UserLink userId={user.user_id} size='s' />
133+
</span>
134+
) : null}
108135
</div>
109136
</div>
110137
<Button
111138
variant='secondary'
112139
size='small'
113-
onClick={handleAddTrack}
140+
onClick={handleAddClick}
114141
onMouseDown={(e) => e.preventDefault()}
115142
disabled={trackIsInCollection}
116143
>

0 commit comments

Comments
 (0)