dropdown-menu.tsx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. import { DropdownMenu as Kobalte } from "@kobalte/core/dropdown-menu"
  2. import { splitProps } from "solid-js"
  3. import type { ComponentProps, ParentProps } from "solid-js"
  4. export interface DropdownMenuProps extends ComponentProps<typeof Kobalte> {}
  5. export interface DropdownMenuTriggerProps extends ComponentProps<typeof Kobalte.Trigger> {}
  6. export interface DropdownMenuIconProps extends ComponentProps<typeof Kobalte.Icon> {}
  7. export interface DropdownMenuPortalProps extends ComponentProps<typeof Kobalte.Portal> {}
  8. export interface DropdownMenuContentProps extends ComponentProps<typeof Kobalte.Content> {}
  9. export interface DropdownMenuArrowProps extends ComponentProps<typeof Kobalte.Arrow> {}
  10. export interface DropdownMenuSeparatorProps extends ComponentProps<typeof Kobalte.Separator> {}
  11. export interface DropdownMenuGroupProps extends ComponentProps<typeof Kobalte.Group> {}
  12. export interface DropdownMenuGroupLabelProps extends ComponentProps<typeof Kobalte.GroupLabel> {}
  13. export interface DropdownMenuItemProps extends ComponentProps<typeof Kobalte.Item> {}
  14. export interface DropdownMenuItemLabelProps extends ComponentProps<typeof Kobalte.ItemLabel> {}
  15. export interface DropdownMenuItemDescriptionProps extends ComponentProps<typeof Kobalte.ItemDescription> {}
  16. export interface DropdownMenuItemIndicatorProps extends ComponentProps<typeof Kobalte.ItemIndicator> {}
  17. export interface DropdownMenuRadioGroupProps extends ComponentProps<typeof Kobalte.RadioGroup> {}
  18. export interface DropdownMenuRadioItemProps extends ComponentProps<typeof Kobalte.RadioItem> {}
  19. export interface DropdownMenuCheckboxItemProps extends ComponentProps<typeof Kobalte.CheckboxItem> {}
  20. export interface DropdownMenuSubProps extends ComponentProps<typeof Kobalte.Sub> {}
  21. export interface DropdownMenuSubTriggerProps extends ComponentProps<typeof Kobalte.SubTrigger> {}
  22. export interface DropdownMenuSubContentProps extends ComponentProps<typeof Kobalte.SubContent> {}
  23. function DropdownMenuRoot(props: DropdownMenuProps) {
  24. return <Kobalte {...props} data-component="dropdown-menu" />
  25. }
  26. function DropdownMenuTrigger(props: ParentProps<DropdownMenuTriggerProps>) {
  27. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  28. return (
  29. <Kobalte.Trigger
  30. {...rest}
  31. data-slot="dropdown-menu-trigger"
  32. classList={{
  33. ...(local.classList ?? {}),
  34. [local.class ?? ""]: !!local.class,
  35. }}
  36. >
  37. {local.children}
  38. </Kobalte.Trigger>
  39. )
  40. }
  41. function DropdownMenuIcon(props: ParentProps<DropdownMenuIconProps>) {
  42. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  43. return (
  44. <Kobalte.Icon
  45. {...rest}
  46. data-slot="dropdown-menu-icon"
  47. classList={{
  48. ...(local.classList ?? {}),
  49. [local.class ?? ""]: !!local.class,
  50. }}
  51. >
  52. {local.children}
  53. </Kobalte.Icon>
  54. )
  55. }
  56. function DropdownMenuPortal(props: DropdownMenuPortalProps) {
  57. return <Kobalte.Portal {...props} />
  58. }
  59. function DropdownMenuContent(props: ParentProps<DropdownMenuContentProps>) {
  60. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  61. return (
  62. <Kobalte.Content
  63. {...rest}
  64. data-component="dropdown-menu-content"
  65. classList={{
  66. ...(local.classList ?? {}),
  67. [local.class ?? ""]: !!local.class,
  68. }}
  69. >
  70. {local.children}
  71. </Kobalte.Content>
  72. )
  73. }
  74. function DropdownMenuArrow(props: DropdownMenuArrowProps) {
  75. const [local, rest] = splitProps(props, ["class", "classList"])
  76. return (
  77. <Kobalte.Arrow
  78. {...rest}
  79. data-slot="dropdown-menu-arrow"
  80. classList={{
  81. ...(local.classList ?? {}),
  82. [local.class ?? ""]: !!local.class,
  83. }}
  84. />
  85. )
  86. }
  87. function DropdownMenuSeparator(props: DropdownMenuSeparatorProps) {
  88. const [local, rest] = splitProps(props, ["class", "classList"])
  89. return (
  90. <Kobalte.Separator
  91. {...rest}
  92. data-slot="dropdown-menu-separator"
  93. classList={{
  94. ...(local.classList ?? {}),
  95. [local.class ?? ""]: !!local.class,
  96. }}
  97. />
  98. )
  99. }
  100. function DropdownMenuGroup(props: ParentProps<DropdownMenuGroupProps>) {
  101. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  102. return (
  103. <Kobalte.Group
  104. {...rest}
  105. data-slot="dropdown-menu-group"
  106. classList={{
  107. ...(local.classList ?? {}),
  108. [local.class ?? ""]: !!local.class,
  109. }}
  110. >
  111. {local.children}
  112. </Kobalte.Group>
  113. )
  114. }
  115. function DropdownMenuGroupLabel(props: ParentProps<DropdownMenuGroupLabelProps>) {
  116. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  117. return (
  118. <Kobalte.GroupLabel
  119. {...rest}
  120. data-slot="dropdown-menu-group-label"
  121. classList={{
  122. ...(local.classList ?? {}),
  123. [local.class ?? ""]: !!local.class,
  124. }}
  125. >
  126. {local.children}
  127. </Kobalte.GroupLabel>
  128. )
  129. }
  130. function DropdownMenuItem(props: ParentProps<DropdownMenuItemProps>) {
  131. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  132. return (
  133. <Kobalte.Item
  134. {...rest}
  135. data-slot="dropdown-menu-item"
  136. classList={{
  137. ...(local.classList ?? {}),
  138. [local.class ?? ""]: !!local.class,
  139. }}
  140. >
  141. {local.children}
  142. </Kobalte.Item>
  143. )
  144. }
  145. function DropdownMenuItemLabel(props: ParentProps<DropdownMenuItemLabelProps>) {
  146. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  147. return (
  148. <Kobalte.ItemLabel
  149. {...rest}
  150. data-slot="dropdown-menu-item-label"
  151. classList={{
  152. ...(local.classList ?? {}),
  153. [local.class ?? ""]: !!local.class,
  154. }}
  155. >
  156. {local.children}
  157. </Kobalte.ItemLabel>
  158. )
  159. }
  160. function DropdownMenuItemDescription(props: ParentProps<DropdownMenuItemDescriptionProps>) {
  161. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  162. return (
  163. <Kobalte.ItemDescription
  164. {...rest}
  165. data-slot="dropdown-menu-item-description"
  166. classList={{
  167. ...(local.classList ?? {}),
  168. [local.class ?? ""]: !!local.class,
  169. }}
  170. >
  171. {local.children}
  172. </Kobalte.ItemDescription>
  173. )
  174. }
  175. function DropdownMenuItemIndicator(props: ParentProps<DropdownMenuItemIndicatorProps>) {
  176. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  177. return (
  178. <Kobalte.ItemIndicator
  179. {...rest}
  180. data-slot="dropdown-menu-item-indicator"
  181. classList={{
  182. ...(local.classList ?? {}),
  183. [local.class ?? ""]: !!local.class,
  184. }}
  185. >
  186. {local.children}
  187. </Kobalte.ItemIndicator>
  188. )
  189. }
  190. function DropdownMenuRadioGroup(props: ParentProps<DropdownMenuRadioGroupProps>) {
  191. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  192. return (
  193. <Kobalte.RadioGroup
  194. {...rest}
  195. data-slot="dropdown-menu-radio-group"
  196. classList={{
  197. ...(local.classList ?? {}),
  198. [local.class ?? ""]: !!local.class,
  199. }}
  200. >
  201. {local.children}
  202. </Kobalte.RadioGroup>
  203. )
  204. }
  205. function DropdownMenuRadioItem(props: ParentProps<DropdownMenuRadioItemProps>) {
  206. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  207. return (
  208. <Kobalte.RadioItem
  209. {...rest}
  210. data-slot="dropdown-menu-radio-item"
  211. classList={{
  212. ...(local.classList ?? {}),
  213. [local.class ?? ""]: !!local.class,
  214. }}
  215. >
  216. {local.children}
  217. </Kobalte.RadioItem>
  218. )
  219. }
  220. function DropdownMenuCheckboxItem(props: ParentProps<DropdownMenuCheckboxItemProps>) {
  221. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  222. return (
  223. <Kobalte.CheckboxItem
  224. {...rest}
  225. data-slot="dropdown-menu-checkbox-item"
  226. classList={{
  227. ...(local.classList ?? {}),
  228. [local.class ?? ""]: !!local.class,
  229. }}
  230. >
  231. {local.children}
  232. </Kobalte.CheckboxItem>
  233. )
  234. }
  235. function DropdownMenuSub(props: DropdownMenuSubProps) {
  236. return <Kobalte.Sub {...props} />
  237. }
  238. function DropdownMenuSubTrigger(props: ParentProps<DropdownMenuSubTriggerProps>) {
  239. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  240. return (
  241. <Kobalte.SubTrigger
  242. {...rest}
  243. data-slot="dropdown-menu-sub-trigger"
  244. classList={{
  245. ...(local.classList ?? {}),
  246. [local.class ?? ""]: !!local.class,
  247. }}
  248. >
  249. {local.children}
  250. </Kobalte.SubTrigger>
  251. )
  252. }
  253. function DropdownMenuSubContent(props: ParentProps<DropdownMenuSubContentProps>) {
  254. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  255. return (
  256. <Kobalte.SubContent
  257. {...rest}
  258. data-component="dropdown-menu-sub-content"
  259. classList={{
  260. ...(local.classList ?? {}),
  261. [local.class ?? ""]: !!local.class,
  262. }}
  263. >
  264. {local.children}
  265. </Kobalte.SubContent>
  266. )
  267. }
  268. export const DropdownMenu = Object.assign(DropdownMenuRoot, {
  269. Trigger: DropdownMenuTrigger,
  270. Icon: DropdownMenuIcon,
  271. Portal: DropdownMenuPortal,
  272. Content: DropdownMenuContent,
  273. Arrow: DropdownMenuArrow,
  274. Separator: DropdownMenuSeparator,
  275. Group: DropdownMenuGroup,
  276. GroupLabel: DropdownMenuGroupLabel,
  277. Item: DropdownMenuItem,
  278. ItemLabel: DropdownMenuItemLabel,
  279. ItemDescription: DropdownMenuItemDescription,
  280. ItemIndicator: DropdownMenuItemIndicator,
  281. RadioGroup: DropdownMenuRadioGroup,
  282. RadioItem: DropdownMenuRadioItem,
  283. CheckboxItem: DropdownMenuCheckboxItem,
  284. Sub: DropdownMenuSub,
  285. SubTrigger: DropdownMenuSubTrigger,
  286. SubContent: DropdownMenuSubContent,
  287. })