Skip to content

Commit d1e2a46

Browse files
committed
web: better hover, open track
1 parent cd1343f commit d1e2a46

File tree

3 files changed

+82
-30
lines changed

3 files changed

+82
-30
lines changed

src/web/src/ui/feed/item/feed-item.tsx

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { Album } from "../album.tsx";
1010
import { Artist } from "../artist.tsx";
1111

1212
interface Props {
13+
isOpen: boolean;
14+
onClick: (e: React.MouseEvent<HTMLElement>) => void;
1315
artist: string;
1416
album: string | null;
1517
track: string;
@@ -19,7 +21,7 @@ interface Props {
1921

2022
export function FeedItem(props: Props) {
2123
const { t, i18n } = useLingui();
22-
const { artist, album, track, user, listenedAt } = props;
24+
const { isOpen, onClick, artist, album, track, user, listenedAt } = props;
2325

2426
function handleOnClick(e: React.MouseEvent<HTMLDivElement>) {
2527
e.preventDefault();
@@ -28,35 +30,44 @@ export function FeedItem(props: Props) {
2830
success: t`copyToClipboard.success`,
2931
error: t`copyToClipboard.error`,
3032
});
33+
alert("clicked");
3134
}
3235

3336
return (
34-
<div className="feed_row">
35-
<div className="track_side" onClick={handleOnClick}>
36-
<div className="track">
37-
<Marquee text={track} />
37+
<div
38+
className={`feed_row ${isOpen ? "isOpen" : ""}`}
39+
onClick={(e) => {
40+
handleOnClick(e);
41+
onClick(e);
42+
}}
43+
>
44+
<div className="track_item">
45+
<div className="track_side">
46+
<div className="track">
47+
<Marquee text={track} />
48+
</div>
49+
<div className="artist">
50+
<Artist name={artist} />
51+
<Album name={album} />
52+
</div>
3853
</div>
39-
<div className="artist">
40-
<Artist name={artist} />
41-
<Album name={album} />
54+
<div className="user_side">
55+
<div
56+
className="listened_at"
57+
title={localizeDateTimeBrowser(listenedAt)}
58+
>
59+
{localizeRelativeTimeBrowser(listenedAt, i18n.locale, {
60+
seconds: t`time.seconds`,
61+
minutes: t`time.minutes`,
62+
hours: t`time.hours`,
63+
days: t`time.days`,
64+
ago: t`time.ago`,
65+
in: t`time.in`,
66+
})}
67+
</div>
68+
<User name={user} />
4269
</div>
4370
</div>
44-
<div className="user_side">
45-
<div
46-
className="listened_at"
47-
title={localizeDateTimeBrowser(listenedAt)}
48-
>
49-
{localizeRelativeTimeBrowser(listenedAt, i18n.locale, {
50-
seconds: t`time.seconds`,
51-
minutes: t`time.minutes`,
52-
hours: t`time.hours`,
53-
days: t`time.days`,
54-
ago: t`time.ago`,
55-
in: t`time.in`,
56-
})}
57-
</div>
58-
<User name={user} />
59-
</div>
6071
</div>
6172
);
6273
}

src/web/src/ui/feed/list/feed-list.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useState } from "react";
12
import { FeedItem } from "../item/feed-item.tsx";
23
import { ListenedTracks } from "../../../data/tracks-api.ts";
34
import { MusicLoader } from "../../activity/loader.tsx";
@@ -14,6 +15,8 @@ interface FeedListProps {
1415
}
1516

1617
export function FeedList(props: FeedListProps) {
18+
const [trackIsOpen, setTrackIsOpen] = useState<string | null>(null);
19+
1720
const {
1821
data,
1922
isLoading,
@@ -37,6 +40,8 @@ export function FeedList(props: FeedListProps) {
3740
{hasData && (data.map((item: ListenedTracks) => (
3841
<FeedItem
3942
key={item.id}
43+
isOpen={trackIsOpen === item.id}
44+
onClick={() => setTrackIsOpen(item.id)}
4045
artist={item.artist_name}
4146
album={item.album_name}
4247
track={item.track_name}

src/web/src/ui/feed/list/feed.module.css

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,53 @@
2525
}
2626

2727
.feed_row {
28+
padding-top: 10px;
29+
background: transparent;
30+
31+
transition: 0.3s all cubic-bezier(0.4, 0, 0.2, 1);
32+
33+
&:first-child {
34+
padding-top: 0;
35+
}
36+
37+
/* desktop only */
38+
@media (hover: hover) and (pointer: fine) {
39+
&:hover {
40+
padding-top: 30px;
41+
padding-bottom: 30px;
42+
43+
margin-left: -10px;
44+
margin-right: -10px;
45+
}
46+
}
47+
48+
/* mobile only */
49+
&.isOpen {
50+
padding-top: 30px;
51+
padding-bottom: 30px;
52+
53+
margin-left: -10px;
54+
margin-right: -10px;
55+
56+
.track_item {
57+
padding: 20px 15px;
58+
}
59+
}
60+
61+
&:first-child {
62+
&:hover {
63+
padding-top: 0;
64+
}
65+
}
66+
}
67+
68+
.track_item {
2869
display: flex;
2970
flex-direction: row;
3071
flex-wrap: nowrap;
3172
justify-content: space-between;
3273

3374
padding: 10px 15px;
34-
margin-top: 10px;
3575

3676
border-radius: 6px;
3777

@@ -41,13 +81,9 @@
4181

4282
transition: 0.3s all cubic-bezier(0.4, 0, 0.2, 1);
4383

44-
&:first-child {
45-
margin-top: 0;
46-
}
47-
4884
&:hover {
4985
background: #1e1e1e;
50-
border-color: #2f2f2f;
86+
border-color: #636363;
5187

5288
box-shadow:
5389
rgba(0, 0, 0, 0) 0 0 0 0,

0 commit comments

Comments
 (0)