Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 159 additions & 2 deletions packages/demo/src/components/demo/dropdown-menu.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { useState } from "react";
import {
Avatar,

Check warning on line 3 in packages/demo/src/components/demo/dropdown-menu.tsx

View workflow job for this annotation

GitHub Actions / quality

'Avatar' is defined but never used. Allowed unused vars must match /^_/u
AvatarFallback,

Check warning on line 4 in packages/demo/src/components/demo/dropdown-menu.tsx

View workflow job for this annotation

GitHub Actions / quality

'AvatarFallback' is defined but never used. Allowed unused vars must match /^_/u
Button,
DropdownMenu,
DropdownMenuTrigger,
Expand All @@ -15,9 +17,32 @@
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuSearch,
DropdownMenuEmpty,
Icon,
} from "@eqtylab/equality";
import { Settings, User, LogOut } from "lucide-react";

const MEMBERS = [
{ name: "Ada Lovelace", icon: "User" },
{ name: "Alan Turing", icon: "UserCog" },
{ name: "Grace Hopper", icon: "User" },
{ name: "Katherine Johnson", icon: "UserCog" },
{ name: "Linus Torvalds", icon: "UserStar" },
{ name: "Margaret Hamilton", icon: "User" },
];

const COLUMN_LABELS: Record<string, string> = {
name: "Name",
email: "Email",
role: "Role",
status: "Status",
created: "Created",
lastActive: "Last active",
team: "Team",
location: "Location",
};

export const DropdownMenuDemo = ({
variant = "default",
}: {
Expand All @@ -28,12 +53,26 @@
| "with-radio"
| "with-shortcuts"
| "with-submenu"
| "with-groups";
| "with-groups"
| "with-search"
| "with-search-always"
| "with-search-submenu";
}) => {
const [showStatusBar, setShowStatusBar] = useState(true);
const [showActivityBar, setShowActivityBar] = useState(false);
const [showPanel, setShowPanel] = useState(false);
const [position, setPosition] = useState("bottom");
const [assignee, setAssignee] = useState<string | null>(null);
const [columns, setColumns] = useState<Record<string, boolean>>({
name: true,
email: true,
role: true,
status: false,
created: false,
lastActive: false,
team: false,
location: false,
});

if (variant === "default") {
return (
Expand Down Expand Up @@ -192,6 +231,7 @@
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
<DropdownMenuSearch placeholder="Search tools…" />
<DropdownMenuItem>Back</DropdownMenuItem>
<DropdownMenuItem>Forward</DropdownMenuItem>
<DropdownMenuItem>Reload</DropdownMenuItem>
Expand All @@ -205,11 +245,30 @@
<DropdownMenuItem>Create Shortcut...</DropdownMenuItem>
<DropdownMenuItem>Name Window...</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>Developer Tools</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<span>Developer Tools</span>
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>Console</DropdownMenuItem>
<DropdownMenuItem>Network</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<span>Profiling</span>
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>Performance</DropdownMenuItem>
<DropdownMenuItem>Memory</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
</DropdownMenuSubContent>
</DropdownMenuSub>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuSeparator />
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuEmpty>No results found</DropdownMenuEmpty>
</DropdownMenuContent>
</DropdownMenu>
</div>
Expand Down Expand Up @@ -256,5 +315,103 @@
);
}

if (variant === "with-search") {
return (
<div style={{ margin: "1rem 0" }}>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button size="sm" variant="tertiary">
{assignee ? `Assigned: ${assignee}` : "Assign reviewer"}
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
<DropdownMenuSearch placeholder="Search members..." />
<DropdownMenuLabel>Team members</DropdownMenuLabel>
{MEMBERS.map((person) => (
<DropdownMenuItem
key={person.name}
textValue={person.name}
onSelect={() => setAssignee(person.name)}
>
<Icon
icon={person.icon}
size="xs"
background="circle"
elevation="raised"
/>
<span>{person.name}</span>
</DropdownMenuItem>
))}
<DropdownMenuEmpty>No members found</DropdownMenuEmpty>
</DropdownMenuContent>
</DropdownMenu>
</div>
);
}

if (variant === "with-search-always") {
return (
<div style={{ margin: "1rem 0" }}>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button size="sm" variant="tertiary">
Columns
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
<DropdownMenuSearch alwaysVisible placeholder="Search columns…" />
<DropdownMenuLabel>Toggle columns</DropdownMenuLabel>
{Object.entries(COLUMN_LABELS).map(([key, label]) => (
<DropdownMenuCheckboxItem
key={key}
checked={columns[key]}
onCheckedChange={(checked) =>
setColumns((prev) => ({ ...prev, [key]: checked }))
}
onSelect={(event) => event.preventDefault()}
>
{label}
</DropdownMenuCheckboxItem>
))}
<DropdownMenuEmpty>No columns found</DropdownMenuEmpty>
</DropdownMenuContent>
</DropdownMenu>
</div>
);
}

if (variant === "with-search-submenu") {
return (
<div style={{ margin: "1rem 0" }}>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button size="sm" variant="tertiary">
Edit
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
<DropdownMenuSearch placeholder="Search actions…" />
<DropdownMenuItem>Cut</DropdownMenuItem>
<DropdownMenuItem>Copy</DropdownMenuItem>
<DropdownMenuItem>Paste</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<span>More Tools</span>
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>Save Page As...</DropdownMenuItem>
<DropdownMenuItem>Create Shortcut...</DropdownMenuItem>
<DropdownMenuItem>Developer Tools</DropdownMenuItem>
<DropdownMenuItem>Task Manager</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuEmpty>No actions found</DropdownMenuEmpty>
</DropdownMenuContent>
</DropdownMenu>
</div>
);
}

return null;
};
Loading
Loading