diff --git a/web/src/pages/audiobooks/AudiobookDetail.tsx b/web/src/pages/audiobooks/AudiobookDetail.tsx index 180a9978..fad17287 100644 --- a/web/src/pages/audiobooks/AudiobookDetail.tsx +++ b/web/src/pages/audiobooks/AudiobookDetail.tsx @@ -6,6 +6,7 @@ import { Button } from "@/components/ui/button"; import { Play } from "lucide-react"; import AudiobookPlayer from "./player/AudiobookPlayer"; import { ChaptersSection } from "./components/ChaptersSection"; +import { NarratorCard } from "./components/NarratorCard"; import DetailHero from "@/pages/ItemDetail/DetailHero"; import MetadataBadges from "@/pages/ItemDetail/components/MetadataBadges"; import type { AudiobookChapter, AudiobookFile } from "@/lib/audiobooks/types"; @@ -229,6 +230,7 @@ export default function AudiobookDetail() { currentPositionSeconds={playerOpen ? startSeconds : resumeSeconds || null} onSelect={(s) => openPlayer(s)} /> + {narrator && } ); diff --git a/web/src/pages/audiobooks/components/NarratorCard.tsx b/web/src/pages/audiobooks/components/NarratorCard.tsx new file mode 100644 index 00000000..3f1d4dcb --- /dev/null +++ b/web/src/pages/audiobooks/components/NarratorCard.tsx @@ -0,0 +1,28 @@ +interface NarratorCardProps { + narrator: string; +} + +function initials(name: string): string { + return name + .split(/\s+/) + .filter(Boolean) + .slice(0, 2) + .map((w) => w[0]?.toUpperCase() ?? "") + .join(""); +} + +export function NarratorCard({ narrator }: NarratorCardProps) { + return ( +
+

Narrator

+
+
+ {initials(narrator) || "?"} +
+
+

{narrator}

+
+
+
+ ); +}