The Command component is a wrapper over CMDK's Command component. Pretty much every object in that library is wrapped here. We will use this for the guts of our combobox.
128 lines
3.4 KiB
TypeScript
128 lines
3.4 KiB
TypeScript
import { forwardRef } from 'react'
|
|
import classNames from 'classnames'
|
|
|
|
import { Command as CommandPrimitive } from 'cmdk'
|
|
import { Dialog } from '../Dialog'
|
|
import { DialogContent, DialogProps } from '@radix-ui/react-dialog'
|
|
|
|
import './index.scss'
|
|
|
|
const Command = forwardRef<
|
|
React.ElementRef<typeof CommandPrimitive>,
|
|
React.ComponentPropsWithoutRef<typeof CommandPrimitive>
|
|
>(({ className, ...props }, ref) => (
|
|
<CommandPrimitive ref={ref} className={className} {...props} />
|
|
))
|
|
Command.displayName = CommandPrimitive.displayName
|
|
|
|
interface CommandDialogProps extends DialogProps {}
|
|
|
|
const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
|
|
return (
|
|
<Dialog {...props}>
|
|
<DialogContent className="DialogContent">
|
|
<Command>{children}</Command>
|
|
</DialogContent>
|
|
</Dialog>
|
|
)
|
|
}
|
|
|
|
const CommandInput = forwardRef<
|
|
React.ElementRef<typeof CommandPrimitive.Input>,
|
|
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>
|
|
>(({ className, ...props }, ref) => (
|
|
<div>
|
|
<CommandPrimitive.Input
|
|
ref={ref}
|
|
className={classNames({ CommandInput: true }, className)}
|
|
{...props}
|
|
/>
|
|
</div>
|
|
))
|
|
|
|
CommandInput.displayName = CommandPrimitive.Input.displayName
|
|
|
|
const CommandList = forwardRef<
|
|
React.ElementRef<typeof CommandPrimitive.List>,
|
|
React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>
|
|
>(({ className, ...props }, ref) => (
|
|
<CommandPrimitive.List
|
|
ref={ref}
|
|
className={classNames({ CommandList: true }, className)}
|
|
{...props}
|
|
/>
|
|
))
|
|
|
|
CommandList.displayName = CommandPrimitive.List.displayName
|
|
|
|
const CommandEmpty = forwardRef<
|
|
React.ElementRef<typeof CommandPrimitive.Empty>,
|
|
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>
|
|
>((props, ref) => (
|
|
<CommandPrimitive.Empty ref={ref} className="CommandEmpty" {...props} />
|
|
))
|
|
|
|
CommandEmpty.displayName = CommandPrimitive.Empty.displayName
|
|
|
|
const CommandGroup = forwardRef<
|
|
React.ElementRef<typeof CommandPrimitive.Group>,
|
|
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>
|
|
>(({ className, ...props }, ref) => (
|
|
<CommandPrimitive.Group
|
|
ref={ref}
|
|
className={classNames({ CommandGroup: true }, className)}
|
|
{...props}
|
|
/>
|
|
))
|
|
|
|
CommandGroup.displayName = CommandPrimitive.Group.displayName
|
|
|
|
const CommandSeparator = forwardRef<
|
|
React.ElementRef<typeof CommandPrimitive.Separator>,
|
|
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>
|
|
>(({ className, ...props }, ref) => (
|
|
<CommandPrimitive.Separator
|
|
ref={ref}
|
|
className={classNames({ CommandSeparator: true }, className)}
|
|
{...props}
|
|
/>
|
|
))
|
|
CommandSeparator.displayName = CommandPrimitive.Separator.displayName
|
|
|
|
const CommandItem = forwardRef<
|
|
React.ElementRef<typeof CommandPrimitive.Item>,
|
|
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>
|
|
>(({ className, ...props }, ref) => (
|
|
<CommandPrimitive.Item
|
|
ref={ref}
|
|
className={classNames({ CommandItem: true }, className)}
|
|
{...props}
|
|
/>
|
|
))
|
|
|
|
CommandItem.displayName = CommandPrimitive.Item.displayName
|
|
|
|
const CommandShortcut = ({
|
|
className,
|
|
...props
|
|
}: React.HTMLAttributes<HTMLSpanElement>) => {
|
|
return (
|
|
<span
|
|
className={classNames({ CommandShortcut: true }, className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
CommandShortcut.displayName = 'CommandShortcut'
|
|
|
|
export {
|
|
Command,
|
|
CommandDialog,
|
|
CommandInput,
|
|
CommandList,
|
|
CommandEmpty,
|
|
CommandGroup,
|
|
CommandItem,
|
|
CommandShortcut,
|
|
CommandSeparator,
|
|
}
|