summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/dropdown-menu.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-09 03:45:50 -0600
committerAdam <[email protected]>2025-12-09 06:12:09 -0600
commit0a357be160d672791bb99a36fc7d7c1299d5493d (patch)
tree5c5c3ee1360a0adf40b1e47691fb2ef9ef2408aa /packages/ui/src/components/dropdown-menu.tsx
parentd29205e67787d49de9dd4c271ec8e4e7848d81ad (diff)
downloadopencode-0a357be160d672791bb99a36fc7d7c1299d5493d.tar.gz
opencode-0a357be160d672791bb99a36fc7d7c1299d5493d.zip
wip(desktop): progress
Diffstat (limited to 'packages/ui/src/components/dropdown-menu.tsx')
-rw-r--r--packages/ui/src/components/dropdown-menu.tsx308
1 files changed, 308 insertions, 0 deletions
diff --git a/packages/ui/src/components/dropdown-menu.tsx b/packages/ui/src/components/dropdown-menu.tsx
new file mode 100644
index 000000000..efb2b45ca
--- /dev/null
+++ b/packages/ui/src/components/dropdown-menu.tsx
@@ -0,0 +1,308 @@
+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,
+})