Skip to content
34 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar1import { KeyRound, LayoutDashboard, Settings, ShieldQuestion } from "lucide-react";
2
3import { TabLink } from "./ui";
4
5/** The workspace's Security pages, as tabs. */
6export function WorkspaceSecurityTabs({ owner, pending }: { owner: string; pending?: number }) {
7 const base = `/${owner}/-/security`;
8 return (
9 <nav aria-label="Security" className="mb-6 flex gap-1 overflow-x-auto border-b border-line [scrollbar-width:none]">
10 <TabLink to={base} end icon={<LayoutDashboard size={14} />}>
11 Overview
12 </TabLink>
13 <TabLink to={`${base}/bypass-requests`} icon={<ShieldQuestion size={14} />} count={pending}>
14 Bypass requests
15 </TabLink>
16 <TabLink to={`${base}/patterns`} icon={<KeyRound size={14} />}>
17 Custom patterns
18 </TabLink>
19 <TabLink to={`${base}/settings`} icon={<Settings size={14} />}>
20 Settings
21 </TabLink>
22 </nav>
23 );
24}
25
26/** A Security sub-page's own heading, where the layout gives it none. */
27export function WorkspaceSecurityHeading({ title, about }: { title: string; about: string }) {
28 return (
29 <header className="mb-6">
30 <h1 className="text-2xl font-semibold tracking-tight">{title}</h1>
31 <p className="mt-1.5 text-sm text-muted">{about}</p>
32 </header>
33 );
34}