diff --git a/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.module.css b/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.module.css
new file mode 100644
index 000000000..2a4af2c49
--- /dev/null
+++ b/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.module.css
@@ -0,0 +1,12 @@
+.group {
+ flex-wrap: nowrap;
+ gap: var(--theme-spacing-sm) var(--theme-spacing-xs);
+ min-width: 0;
+ padding: var(--theme-spacing-xs) 0;
+ overflow: hidden;
+}
+
+.group a {
+ cursor: pointer;
+ user-select: none;
+}
diff --git a/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.tsx b/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.tsx
index d196d77ef..8cff88338 100644
--- a/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.tsx
+++ b/src/renderer/components/item-list/item-detail-list/columns/genre-badge-column.tsx
@@ -1,4 +1,46 @@
+import { useMemo } from 'react';
+import { generatePath, Link } from 'react-router';
+
+import styles from './genre-badge-column.module.css';
import { ItemDetailListCellProps } from './types';
-export const GenreBadgeColumn = ({ song }: ItemDetailListCellProps) =>
- song.genres?.length ? song.genres.map((g) => g.name).join(', ') : <> >;
+import { AppRoute } from '/@/renderer/router/routes';
+import { Badge } from '/@/shared/components/badge/badge';
+import { Group } from '/@/shared/components/group/group';
+import { stringToColor } from '/@/shared/utils/string-to-color';
+
+const MAX_GENRES = 4;
+
+export const GenreBadgeColumn = ({ song }: ItemDetailListCellProps) => {
+ const genres = song.genres;
+
+ const genresWithStyle = useMemo(() => {
+ if (!genres) return [];
+ return genres.slice(0, MAX_GENRES).map((genre) => {
+ const { color, isLight } = stringToColor(genre.name);
+ const path = generatePath(AppRoute.LIBRARY_GENRES_DETAIL, { genreId: genre.id });
+ return { ...genre, color, isLight, path };
+ });
+ }, [genres]);
+
+ if (!genresWithStyle.length) return <> >;
+
+ return (
+
+ {genresWithStyle.map((genre) => (
+
+ {genre.name}
+
+ ))}
+
+ );
+};
diff --git a/src/renderer/components/item-list/item-detail-list/columns/genre-column.tsx b/src/renderer/components/item-list/item-detail-list/columns/genre-column.tsx
index e337fe123..6c3406910 100644
--- a/src/renderer/components/item-list/item-detail-list/columns/genre-column.tsx
+++ b/src/renderer/components/item-list/item-detail-list/columns/genre-column.tsx
@@ -1,4 +1,40 @@
-import { ItemDetailListCellProps } from './types';
+import { Fragment } from 'react';
+import { generatePath, Link } from 'react-router';
-export const GenreColumn = ({ song }: ItemDetailListCellProps) =>
- song.genres?.length ? song.genres.map((g) => g.name).join(', ') : <> >;
+import { ItemDetailListCellProps } from '/@/renderer/components/item-list/item-detail-list/columns/types';
+import { AppRoute } from '/@/renderer/router/routes';
+import { Text } from '/@/shared/components/text/text';
+
+const TEXT_PROPS = { isMuted: true, isNoSelect: true, size: 'sm' as const } as const;
+
+export const GenreColumn = ({ isRowHovered, song }: ItemDetailListCellProps) => {
+ const genres = song.genres ?? [];
+ if (!genres.length) return <> >;
+
+ return (
+ <>
+ {genres.map((genre, index) => (
+
+ {isRowHovered ? (
+
+ {genre.name}
+
+ ) : (
+
+ {genre.name}
+
+ )}
+ {index < genres.length - 1 && ', '}
+
+ ))}
+ >
+ );
+};