Fix updateTag during render, hide scrollbars, polish type badge and hover styles

- Add `revalidate` option to `refreshCredits` and `refreshRecommendations`;
  pass `{ revalidate: false }` from `ensureEnriched` to avoid calling
  `updateTag` outside Server Actions/Route Handlers
- Add `hideScrollbar` prop to all horizontal ScrollArea instances
  (continue-watching, title rows, filterable row, cast carousel)
- Replace text-only type badge in HeroBanner with icon + label using
  IconMovie / IconDeviceTv
- Fix StatusButton destructive hover overrides with `!important` so
  they correctly supersede the status-specific background/text/ring
This commit is contained in:
2026-03-08 11:24:07 -04:00
parent 1407571b64
commit 69f04937bc
8 changed files with 44 additions and 14 deletions
@@ -101,7 +101,7 @@ export function FilterableTitleRow({
</div>
{/* Genre chips */}
<ScrollArea scrollFade>
<ScrollArea scrollFade hideScrollbar>
<div className="flex gap-2">
{genres.map((genre) => (
<Button
@@ -148,6 +148,7 @@ export function FilterableTitleRow({
<ScrollArea
key={selectedGenre ?? "default"}
scrollFade
hideScrollbar
className="-mx-6 sm:-mx-2"
>
<div className="flex gap-4 px-6 py-2 sm:px-2">
@@ -1,6 +1,11 @@
"use client";
import { IconPlus, IconStar } from "@tabler/icons-react";
import {
IconDeviceTv,
IconMovie,
IconPlus,
IconStar,
} from "@tabler/icons-react";
import Image from "next/image";
import { useRouter } from "next/navigation";
import { useTransition } from "react";
@@ -65,8 +70,18 @@ export function HeroBanner({
style={{ "--stagger-index": 3 } as React.CSSProperties}
>
<div className="mb-3 flex items-center gap-2">
<span className="rounded bg-primary/20 px-2 py-0.5 font-semibold text-[10px] text-primary uppercase tracking-wider">
{type}
<span className="inline-flex cursor-default items-center justify-center gap-1 rounded bg-primary/10 px-1.5 py-1 font-medium text-primary text-xs">
{type === "movie" ? (
<>
<IconMovie aria-hidden className="size-3.5" />
Movie
</>
) : (
<>
<IconDeviceTv aria-hidden className="size-3.5" />
TV
</>
)}
</span>
{voteAverage > 0 && (
<span className="flex items-center gap-1 text-primary text-sm">
@@ -35,7 +35,7 @@ export function TitleRow({
{heading}
</h2>
</div>
<ScrollArea scrollFade className="-mx-6 sm:-mx-2">
<ScrollArea scrollFade hideScrollbar className="-mx-6 sm:-mx-2">
<div className="flex gap-4 px-6 py-2 sm:px-2">
{items.map((item, i) => (
<div