import Link from "next/link"; import { cn } from "@plane/utils"; // ============================================================================ // TYPES // ============================================================================ interface AppSidebarItemData { href?: string; label?: string; icon?: React.ReactNode; isActive?: boolean; onClick?: () => void; disabled?: boolean; } interface AppSidebarItemProps { variant?: "link" | "button"; item?: AppSidebarItemData; } interface AppSidebarItemLabelProps { highlight?: boolean; label?: string; } interface AppSidebarItemIconProps { icon?: React.ReactNode; highlight?: boolean; } interface AppSidebarLinkItemProps { href?: string; children: React.ReactNode; className?: string; } interface AppSidebarButtonItemProps { children: React.ReactNode; onClick?: () => void; disabled?: boolean; className?: string; } // ============================================================================ // STYLES // ============================================================================ const styles = { base: "group flex flex-col gap-0.5 items-center justify-center text-custom-text-300", icon: "flex items-center justify-center gap-2 size-8 rounded-md text-custom-text-300", iconActive: "bg-custom-background-80 text-custom-text-200", iconInactive: "group-hover:text-custom-text-200 group-hover:bg-custom-background-80", label: "text-xs font-semibold", labelActive: "text-custom-text-200", labelInactive: "group-hover:text-custom-text-200 text-custom-text-300", } as const; // ============================================================================ // SUB-COMPONENTS // ============================================================================ const AppSidebarItemLabel: React.FC = ({ highlight = false, label }) => { if (!label) return null; return ( {label} ); }; const AppSidebarItemIcon: React.FC = ({ icon, highlight }) => { if (!icon) return null; return (
{icon}
); }; const AppSidebarLinkItem: React.FC = ({ href, children, className }) => { if (!href) return null; return ( {children} ); }; const AppSidebarButtonItem: React.FC = ({ children, onClick, disabled = false, className, }) => ( ); // ============================================================================ // MAIN COMPONENT // ============================================================================ type AppSidebarItemComponent = React.FC & { Label: React.FC; Icon: React.FC; Link: React.FC; Button: React.FC; }; const AppSidebarItem: AppSidebarItemComponent = ({ variant = "link", item }) => { if (!item) return null; const { icon, isActive, label, href, onClick, disabled } = item; const commonItems = ( <> ); if (variant === "link") { return {commonItems}; } return ( {commonItems} ); }; // ============================================================================ // COMPOUND COMPONENT ASSIGNMENT // ============================================================================ AppSidebarItem.Label = AppSidebarItemLabel; AppSidebarItem.Icon = AppSidebarItemIcon; AppSidebarItem.Link = AppSidebarLinkItem; AppSidebarItem.Button = AppSidebarButtonItem; export { AppSidebarItem }; export type { AppSidebarItemData, AppSidebarItemProps };