mirror of
https://github.com/jakejarvis/sofa.git
synced 2026-08-29 03:55:38 -04:00
- Stack title-hero poster/metadata vertically on mobile (flex-col md:flex-row), switch backdrop tall breakpoint from sm to md - Extract bio expand/collapse logic into reusable ExpandableText component; use it in PersonHero and TitleHero - Fix ContinueWatchingCard image to use fill + sizes instead of fixed width/height to avoid layout shift - Add fade-out gradient on genre chip scrollbar edge on mobile - Show scaled-down ambient glow on mobile instead of hiding it entirely - Humanize knownForDepartment labels (Acting→Actor, Directing→Director, etc.) - Change cast member name from truncate to line-clamp-2 for wrapping - Hide tooltip arrow via [&>:last-child]:hidden instead of color-matching it - Apply safe-area-inset padding to HeroBanner content on notched devices
89 lines
3.0 KiB
TypeScript
89 lines
3.0 KiB
TypeScript
"use client";
|
|
|
|
import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
|
|
import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group";
|
|
import type { VariantProps } from "class-variance-authority";
|
|
import * as React from "react";
|
|
import { toggleVariants } from "@/components/ui/toggle";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
const ToggleGroupContext = React.createContext<
|
|
VariantProps<typeof toggleVariants> & {
|
|
spacing?: number;
|
|
orientation?: "horizontal" | "vertical";
|
|
}
|
|
>({
|
|
size: "default",
|
|
variant: "default",
|
|
spacing: 0,
|
|
orientation: "horizontal",
|
|
});
|
|
|
|
function ToggleGroup({
|
|
className,
|
|
variant,
|
|
size,
|
|
spacing = 0,
|
|
orientation = "horizontal",
|
|
children,
|
|
...props
|
|
}: ToggleGroupPrimitive.Props &
|
|
VariantProps<typeof toggleVariants> & {
|
|
spacing?: number;
|
|
orientation?: "horizontal" | "vertical";
|
|
}) {
|
|
return (
|
|
<ToggleGroupPrimitive
|
|
data-slot="toggle-group"
|
|
data-variant={variant}
|
|
data-size={size}
|
|
data-spacing={spacing}
|
|
data-orientation={orientation}
|
|
style={{ "--gap": spacing } as React.CSSProperties}
|
|
className={cn(
|
|
"group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-md data-vertical:flex-col data-vertical:items-stretch data-[size=sm]:rounded-[min(var(--radius-md),8px)]",
|
|
className,
|
|
)}
|
|
{...props}
|
|
>
|
|
<ToggleGroupContext.Provider
|
|
value={{ variant, size, spacing, orientation }}
|
|
>
|
|
{children}
|
|
</ToggleGroupContext.Provider>
|
|
</ToggleGroupPrimitive>
|
|
);
|
|
}
|
|
|
|
function ToggleGroupItem({
|
|
className,
|
|
children,
|
|
variant = "default",
|
|
size = "default",
|
|
...props
|
|
}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {
|
|
const context = React.useContext(ToggleGroupContext);
|
|
|
|
return (
|
|
<TogglePrimitive
|
|
data-slot="toggle-group-item"
|
|
data-variant={context.variant || variant}
|
|
data-size={context.size || size}
|
|
data-spacing={context.spacing}
|
|
className={cn(
|
|
"shrink-0 focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:rounded-none group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-[spacing=0]/toggle-group:px-2 group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-md group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-md group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-md group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-md",
|
|
toggleVariants({
|
|
variant: context.variant || variant,
|
|
size: context.size || size,
|
|
}),
|
|
className,
|
|
)}
|
|
{...props}
|
|
>
|
|
{children}
|
|
</TogglePrimitive>
|
|
);
|
|
}
|
|
|
|
export { ToggleGroup, ToggleGroupItem };
|