diff --git a/k-tv-frontend/app/(main)/library/components/breadcrumb-nav.tsx b/k-tv-frontend/app/(main)/library/components/breadcrumb-nav.tsx
new file mode 100644
index 0000000..8d60f8c
--- /dev/null
+++ b/k-tv-frontend/app/(main)/library/components/breadcrumb-nav.tsx
@@ -0,0 +1,41 @@
+interface Props {
+ series?: string;
+ season?: number;
+ onNavigate: (target: "root" | "series") => void;
+}
+
+export function BreadcrumbNav({ series, season, onNavigate }: Props) {
+ return (
+
+ );
+}
diff --git a/k-tv-frontend/app/(main)/library/components/season-tile.tsx b/k-tv-frontend/app/(main)/library/components/season-tile.tsx
new file mode 100644
index 0000000..bcd8872
--- /dev/null
+++ b/k-tv-frontend/app/(main)/library/components/season-tile.tsx
@@ -0,0 +1,63 @@
+"use client";
+
+import { Film } from "lucide-react";
+import type { SeasonSummary } from "@/lib/types";
+
+interface Props {
+ season: SeasonSummary;
+ selected: boolean;
+ onToggle: () => void;
+ onClick: () => void;
+}
+
+export function SeasonTile({ season, selected, onToggle, onClick }: Props) {
+ return (
+
+
+
+
+
+
{season.episode_count} episodes
+
+
+
+
+ );
+}
diff --git a/k-tv-frontend/app/(main)/library/components/show-tile.tsx b/k-tv-frontend/app/(main)/library/components/show-tile.tsx
new file mode 100644
index 0000000..dc2d32a
--- /dev/null
+++ b/k-tv-frontend/app/(main)/library/components/show-tile.tsx
@@ -0,0 +1,75 @@
+"use client";
+
+import { Tv } from "lucide-react";
+import type { ShowSummary } from "@/lib/types";
+
+interface Props {
+ show: ShowSummary;
+ selected: boolean;
+ onToggle: () => void;
+ onClick: () => void;
+}
+
+export function ShowTile({ show, selected, onToggle, onClick }: Props) {
+ return (
+
+ {/* Thumbnail area - clickable to drill in */}
+
+
+ {/* Info area */}
+
+
+
+ {show.season_count} {show.season_count === 1 ? "season" : "seasons"} · {show.episode_count} eps
+
+ {show.genres.length > 0 && (
+
+ {show.genres.slice(0, 3).join(", ")}
+
+ )}
+
+
+ {/* Select checkbox */}
+
+
+ );
+}