feat: icon view toggle, failing filter, quality badges

List and Tiles are now icons rather than words, centred in their
buttons — Segmented takes a ReactNode label and an optional title.

The red "N failing" count in the sidebar is a button: click it to see
only the channels that failed to refresh, click again for all of them.
It clears itself once a refresh fixes everything, so the filter can
never strand you on an empty list.

The player states its quality as a badge instead of loose grey text,
and a downloaded video now says so too — "Downloaded · 1440p" — read
from the file itself. Quality is the short side, so a portrait Short
reads 1080p rather than 1920p, and it resets between videos so one
never inherits the previous one's number.
This commit is contained in:
vincent
2026-08-29 15:47:32 +02:00
parent 48acaa359f
commit dc1efccf87
4 changed files with 105 additions and 20 deletions
+21 -2
View File
@@ -123,8 +123,27 @@ export default function TopBar({
value={view}
onChange={onView}
options={[
{ value: "list", label: "List" },
{ value: "grid", label: "Tiles" },
{
value: "list",
title: "List",
label: (
<svg viewBox="0 0 24 24" className="size-4" fill="none" stroke="currentColor" strokeWidth="2">
<path strokeLinecap="round" d="M4 6h16M4 12h16M4 18h16" />
</svg>
),
},
{
value: "grid",
title: "Tiles",
label: (
<svg viewBox="0 0 24 24" className="size-4" fill="none" stroke="currentColor" strokeWidth="2">
<rect x="4" y="4" width="7" height="7" rx="1.5" />
<rect x="13" y="4" width="7" height="7" rx="1.5" />
<rect x="4" y="13" width="7" height="7" rx="1.5" />
<rect x="13" y="13" width="7" height="7" rx="1.5" />
</svg>
),
},
]}
/>