feat(design): a video's one action list (C1) — the card's "…", the menu holds the rest (E28 S3e1)
- useContextMenu gains buttonProps (a row's visible "…" opens the same menu under the button; a second press closes it) and anchor (the element the menu came from, for a panel a row opens). - ui/MoreButton; ActionMenu rows can run inGesture (a clipboard write inside the click, Safari). - useVideoActions: one builder for a video's menu (play / restart, channel, watched, save, add to playlist, download, details, copy title / link, hide, reset, pin), composed by the feed and by Home's rails; the playlists and details panels open anchored beside the card (VideoFollowUp). - The card keeps watched / save / add to playlist and the "…": on the picture on hover (the duration steps aside), in the rows' action column; on touch only a 44px "…" beside the title. Download, hide, reset and the hover info card leave the card. - The title is selectable: a click ending a selection neither plays nor follows the link. - DESIGN.md: how C1 is built + the log row.
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
import { MoreHorizontal } from "lucide-react";
|
||||
import { IconButton } from "./IconButton";
|
||||
import { type IconButtonSize, type IconButtonVariant } from "./buttonStyles";
|
||||
|
||||
// The visible door to an object's ONE action list (docs/DESIGN.md "Action placement", C1): the "…"
|
||||
// that opens the same menu as a right-click, a long-press and Shift+F10, so no action is reachable
|
||||
// only by a gesture. It carries no menu of its own — `menuProps` is the list's
|
||||
// `useContextMenu().buttonProps(row)`, and `expanded` says whether THIS row's menu is the open one.
|
||||
export function MoreButton({
|
||||
label,
|
||||
expanded,
|
||||
menuProps,
|
||||
variant = "ghost",
|
||||
size = "sm",
|
||||
className,
|
||||
}: {
|
||||
/** The menu's name ("Video actions"): the button's accessible name and tooltip. */
|
||||
label: string;
|
||||
expanded: boolean;
|
||||
menuProps: Record<string, unknown>;
|
||||
variant?: IconButtonVariant;
|
||||
size?: IconButtonSize;
|
||||
className?: string;
|
||||
}) {
|
||||
return (
|
||||
<IconButton
|
||||
variant={variant}
|
||||
size={size}
|
||||
label={label}
|
||||
aria-expanded={expanded}
|
||||
className={className}
|
||||
{...menuProps}
|
||||
>
|
||||
<MoreHorizontal />
|
||||
</IconButton>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user