Portal/rsconcept/frontend/src/components/dropdown/dropdown.tsx

56 lines
1.3 KiB
TypeScript
Raw Normal View History

2025-02-20 20:22:05 +03:00
import { type Styling } from '../props';
2025-04-12 21:47:46 +03:00
import { cn } from '../utils';
2025-02-20 20:22:05 +03:00
interface DropdownProps extends Styling {
2025-03-09 21:57:21 +03:00
/** Reference to the dropdown element. */
ref?: React.Ref<HTMLDivElement>;
/** Unique ID for the dropdown. */
id?: string;
/** Margin for the dropdown. */
margin?: string;
/** Indicates whether the dropdown should stretch to the left. */
2024-06-07 20:17:03 +03:00
stretchLeft?: boolean;
/** Indicates whether the dropdown should stretch to the top. */
2024-06-26 18:59:49 +03:00
stretchTop?: boolean;
/** Indicates whether the dropdown is open. */
2024-06-07 20:17:03 +03:00
isOpen: boolean;
}
/**
2024-10-30 21:35:43 +03:00
* Animated list of children with optional positioning and visibility control.
2025-03-07 16:21:18 +03:00
* Note: Dropdown should be inside a relative container.
*/
2025-02-07 10:53:49 +03:00
export function Dropdown({
2024-09-19 17:48:48 +03:00
isOpen,
stretchLeft,
stretchTop,
margin,
2024-09-19 17:48:48 +03:00
className,
children,
...restProps
}: React.PropsWithChildren<DropdownProps>) {
2024-06-07 20:17:03 +03:00
return (
<div
tabIndex={-1}
2025-04-12 21:47:46 +03:00
className={cn(
'cc-dropdown isolate z-topmost absolute grid bg-popover border rounded-md shadow-lg text-sm',
2025-03-13 01:14:47 +03:00
stretchLeft ? 'right-0' : 'left-0',
stretchTop ? 'bottom-0' : 'top-full',
2025-03-13 13:30:31 +03:00
isOpen && 'open',
margin,
className
)}
aria-hidden={!isOpen}
2025-03-20 18:24:07 +03:00
inert={!isOpen}
{...restProps}
>
{children}
2024-06-07 20:17:03 +03:00
</div>
);
}