import { Link } from "@remix-run/react"; import { cn } from "~/utils/cn"; import { Icon, type RenderIcon } from "./Icon"; import { useRef } from "react"; import { type ShortcutDefinition, useShortcutKeys } from "~/hooks/useShortcutKeys"; import { ShortcutKey } from "./ShortcutKey"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./Tooltip"; const variations = { primary: "text-indigo-500 transition hover:text-indigo-400 inline-flex gap-0.5 items-center group focus-visible:focus-custom", secondary: "text-text-dimmed transition hover:text-text-bright inline-flex gap-0.5 items-center group focus-visible:focus-custom", } as const; type TextLinkProps = { href?: string; to?: string; className?: string; trailingIcon?: RenderIcon; trailingIconClassName?: string; variant?: keyof typeof variations; children: React.ReactNode; shortcut?: ShortcutDefinition; hideShortcutKey?: boolean; tooltip?: React.ReactNode; } & React.AnchorHTMLAttributes; export function TextLink({ href, to, children, className, trailingIcon, trailingIconClassName, variant = "primary", shortcut, hideShortcutKey, tooltip, ...props }: TextLinkProps) { const innerRef = useRef(null); const classes = variations[variant]; if (shortcut) { useShortcutKeys({ shortcut: shortcut, action: () => { if (innerRef.current) { innerRef.current.click(); } }, }); } const renderShortcutKey = () => shortcut && !hideShortcutKey && ; const linkContent = ( <> {children}{" "} {trailingIcon && } {shortcut && !tooltip && renderShortcutKey()} ); const linkElement = to ? ( {linkContent} ) : href ? ( {linkContent} ) : ( Need to define a path or href ); if (tooltip) { return ( {linkElement} {tooltip} {shortcut && renderShortcutKey()} ); } return linkElement; }