1
0
Fork 0
docsearch/packages/docsearch-react/src/components/ui/Menu.tsx
Paul Jankowski ef2bec0e20
feat: Facet filters for search (#2899)
* feat(v5): Initial facet filters work

* Perf updates, dark theme, facet chips, a11y improvements

* fix: bump css bundle size limit

* Dedupe facet filters, refetch facets on searchParameters changes

* Add chevron flourish
2026-06-16 16:38:18 -04:00

75 lines
2.4 KiB
TypeScript

import { Menu as MenuPrimitive } from '@base-ui/react/menu';
import React, { type JSX } from 'react';
import { CheckIcon } from '../../icons';
export function Menu({ ...props }: MenuPrimitive.Root.Props): JSX.Element {
return <MenuPrimitive.Root {...props} />;
}
function MenuTrigger({ className, ...props }: MenuPrimitive.Trigger.Props): JSX.Element {
const cn = `DocSearch-Menu-Trigger${className ? ` ${className}` : ''}`;
return <MenuPrimitive.Trigger className={cn} {...props} />;
}
Menu.Trigger = MenuTrigger;
type MenuPopupProps = MenuPrimitive.Popup.Props &
Pick<MenuPrimitive.Portal.Props, 'container'> &
Pick<MenuPrimitive.Positioner.Props, 'align' | 'alignOffset' | 'collisionBoundary' | 'side' | 'sideOffset'>;
function MenuPopup({
align = 'start',
alignOffset = 0,
side = 'bottom',
sideOffset = 4,
collisionBoundary = 'clipping-ancestors',
container,
...props
}: MenuPopupProps): JSX.Element {
return (
<MenuPrimitive.Portal container={container}>
<MenuPrimitive.Positioner
className="DocSearch-Menu-Positioner"
align={align}
alignOffset={alignOffset}
side={side}
sideOffset={sideOffset}
collisionBoundary={collisionBoundary}
>
<MenuPrimitive.Popup className="DocSearch-Menu-Popup" {...props} />
</MenuPrimitive.Positioner>
</MenuPrimitive.Portal>
);
}
Menu.Popup = MenuPopup;
function MenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props): JSX.Element {
return <MenuPrimitive.RadioGroup {...props} />;
}
Menu.RadioGroup = MenuRadioGroup;
function MenuRadioItem({ className, children, ...props }: MenuPrimitive.RadioItem.Props): JSX.Element {
const cn = `DocSearch-Menu-Item DocSearch-Menu-RadioItem${className ? ` ${className}` : ''}`;
return (
<MenuPrimitive.RadioItem className={cn} closeOnClick={true} {...props}>
<span className="DocSearch-Menu-RadioItem-Indicator">
<MenuPrimitive.RadioItemIndicator>
<CheckIcon />
</MenuPrimitive.RadioItemIndicator>
</span>
{children}
</MenuPrimitive.RadioItem>
);
}
Menu.RadioItem = MenuRadioItem;
function MenuGroupLabel({ className, ...props }: MenuPrimitive.GroupLabel.Props): JSX.Element {
const cn = `DocSearch-Menu-GroupLabel${className ? ` ${className}` : ''}`;
return <MenuPrimitive.GroupLabel className={cn} {...props} />;
}
Menu.GroupLabel = MenuGroupLabel;