309 lines
9.3 KiB
TypeScript
309 lines
9.3 KiB
TypeScript
import { DropdownMenu as Kobalte } from "@kobalte/core/dropdown-menu"
|
|
import { splitProps } from "solid-js"
|
|
import type { ComponentProps, ParentProps } from "solid-js"
|
|
|
|
export interface DropdownMenuProps extends ComponentProps<typeof Kobalte> {}
|
|
export interface DropdownMenuTriggerProps extends ComponentProps<typeof Kobalte.Trigger> {}
|
|
export interface DropdownMenuIconProps extends ComponentProps<typeof Kobalte.Icon> {}
|
|
export interface DropdownMenuPortalProps extends ComponentProps<typeof Kobalte.Portal> {}
|
|
export interface DropdownMenuContentProps extends ComponentProps<typeof Kobalte.Content> {}
|
|
export interface DropdownMenuArrowProps extends ComponentProps<typeof Kobalte.Arrow> {}
|
|
export interface DropdownMenuSeparatorProps extends ComponentProps<typeof Kobalte.Separator> {}
|
|
export interface DropdownMenuGroupProps extends ComponentProps<typeof Kobalte.Group> {}
|
|
export interface DropdownMenuGroupLabelProps extends ComponentProps<typeof Kobalte.GroupLabel> {}
|
|
export interface DropdownMenuItemProps extends ComponentProps<typeof Kobalte.Item> {}
|
|
export interface DropdownMenuItemLabelProps extends ComponentProps<typeof Kobalte.ItemLabel> {}
|
|
export interface DropdownMenuItemDescriptionProps extends ComponentProps<typeof Kobalte.ItemDescription> {}
|
|
export interface DropdownMenuItemIndicatorProps extends ComponentProps<typeof Kobalte.ItemIndicator> {}
|
|
export interface DropdownMenuRadioGroupProps extends ComponentProps<typeof Kobalte.RadioGroup> {}
|
|
export interface DropdownMenuRadioItemProps extends ComponentProps<typeof Kobalte.RadioItem> {}
|
|
export interface DropdownMenuCheckboxItemProps extends ComponentProps<typeof Kobalte.CheckboxItem> {}
|
|
export interface DropdownMenuSubProps extends ComponentProps<typeof Kobalte.Sub> {}
|
|
export interface DropdownMenuSubTriggerProps extends ComponentProps<typeof Kobalte.SubTrigger> {}
|
|
export interface DropdownMenuSubContentProps extends ComponentProps<typeof Kobalte.SubContent> {}
|
|
|
|
function DropdownMenuRoot(props: DropdownMenuProps) {
|
|
return <Kobalte {...props} data-component="dropdown-menu" />
|
|
}
|
|
|
|
function DropdownMenuTrigger(props: ParentProps<DropdownMenuTriggerProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.Trigger
|
|
{...rest}
|
|
data-slot="dropdown-menu-trigger"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.Trigger>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuIcon(props: ParentProps<DropdownMenuIconProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.Icon
|
|
{...rest}
|
|
data-slot="dropdown-menu-icon"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.Icon>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuPortal(props: DropdownMenuPortalProps) {
|
|
return <Kobalte.Portal {...props} />
|
|
}
|
|
|
|
function DropdownMenuContent(props: ParentProps<DropdownMenuContentProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.Content
|
|
{...rest}
|
|
data-component="dropdown-menu-content"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.Content>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuArrow(props: DropdownMenuArrowProps) {
|
|
const [local, rest] = splitProps(props, ["class", "classList"])
|
|
return (
|
|
<Kobalte.Arrow
|
|
{...rest}
|
|
data-slot="dropdown-menu-arrow"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuSeparator(props: DropdownMenuSeparatorProps) {
|
|
const [local, rest] = splitProps(props, ["class", "classList"])
|
|
return (
|
|
<Kobalte.Separator
|
|
{...rest}
|
|
data-slot="dropdown-menu-separator"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuGroup(props: ParentProps<DropdownMenuGroupProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.Group
|
|
{...rest}
|
|
data-slot="dropdown-menu-group"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.Group>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuGroupLabel(props: ParentProps<DropdownMenuGroupLabelProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.GroupLabel
|
|
{...rest}
|
|
data-slot="dropdown-menu-group-label"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.GroupLabel>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuItem(props: ParentProps<DropdownMenuItemProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.Item
|
|
{...rest}
|
|
data-slot="dropdown-menu-item"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.Item>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuItemLabel(props: ParentProps<DropdownMenuItemLabelProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.ItemLabel
|
|
{...rest}
|
|
data-slot="dropdown-menu-item-label"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.ItemLabel>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuItemDescription(props: ParentProps<DropdownMenuItemDescriptionProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.ItemDescription
|
|
{...rest}
|
|
data-slot="dropdown-menu-item-description"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.ItemDescription>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuItemIndicator(props: ParentProps<DropdownMenuItemIndicatorProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.ItemIndicator
|
|
{...rest}
|
|
data-slot="dropdown-menu-item-indicator"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.ItemIndicator>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuRadioGroup(props: ParentProps<DropdownMenuRadioGroupProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.RadioGroup
|
|
{...rest}
|
|
data-slot="dropdown-menu-radio-group"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.RadioGroup>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuRadioItem(props: ParentProps<DropdownMenuRadioItemProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.RadioItem
|
|
{...rest}
|
|
data-slot="dropdown-menu-radio-item"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.RadioItem>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuCheckboxItem(props: ParentProps<DropdownMenuCheckboxItemProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.CheckboxItem
|
|
{...rest}
|
|
data-slot="dropdown-menu-checkbox-item"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.CheckboxItem>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuSub(props: DropdownMenuSubProps) {
|
|
return <Kobalte.Sub {...props} />
|
|
}
|
|
|
|
function DropdownMenuSubTrigger(props: ParentProps<DropdownMenuSubTriggerProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.SubTrigger
|
|
{...rest}
|
|
data-slot="dropdown-menu-sub-trigger"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.SubTrigger>
|
|
)
|
|
}
|
|
|
|
function DropdownMenuSubContent(props: ParentProps<DropdownMenuSubContentProps>) {
|
|
const [local, rest] = splitProps(props, ["class", "classList", "children"])
|
|
return (
|
|
<Kobalte.SubContent
|
|
{...rest}
|
|
data-component="dropdown-menu-sub-content"
|
|
classList={{
|
|
...(local.classList ?? {}),
|
|
[local.class ?? ""]: !!local.class,
|
|
}}
|
|
>
|
|
{local.children}
|
|
</Kobalte.SubContent>
|
|
)
|
|
}
|
|
|
|
export const DropdownMenu = Object.assign(DropdownMenuRoot, {
|
|
Trigger: DropdownMenuTrigger,
|
|
Icon: DropdownMenuIcon,
|
|
Portal: DropdownMenuPortal,
|
|
Content: DropdownMenuContent,
|
|
Arrow: DropdownMenuArrow,
|
|
Separator: DropdownMenuSeparator,
|
|
Group: DropdownMenuGroup,
|
|
GroupLabel: DropdownMenuGroupLabel,
|
|
Item: DropdownMenuItem,
|
|
ItemLabel: DropdownMenuItemLabel,
|
|
ItemDescription: DropdownMenuItemDescription,
|
|
ItemIndicator: DropdownMenuItemIndicator,
|
|
RadioGroup: DropdownMenuRadioGroup,
|
|
RadioItem: DropdownMenuRadioItem,
|
|
CheckboxItem: DropdownMenuCheckboxItem,
|
|
Sub: DropdownMenuSub,
|
|
SubTrigger: DropdownMenuSubTrigger,
|
|
SubContent: DropdownMenuSubContent,
|
|
})
|