context-menu.tsx 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. import { ContextMenu as Kobalte } from "@kobalte/core/context-menu"
  2. import { splitProps } from "solid-js"
  3. import type { ComponentProps, ParentProps } from "solid-js"
  4. export interface ContextMenuProps extends ComponentProps<typeof Kobalte> {}
  5. export interface ContextMenuTriggerProps extends ComponentProps<typeof Kobalte.Trigger> {}
  6. export interface ContextMenuIconProps extends ComponentProps<typeof Kobalte.Icon> {}
  7. export interface ContextMenuPortalProps extends ComponentProps<typeof Kobalte.Portal> {}
  8. export interface ContextMenuContentProps extends ComponentProps<typeof Kobalte.Content> {}
  9. export interface ContextMenuArrowProps extends ComponentProps<typeof Kobalte.Arrow> {}
  10. export interface ContextMenuSeparatorProps extends ComponentProps<typeof Kobalte.Separator> {}
  11. export interface ContextMenuGroupProps extends ComponentProps<typeof Kobalte.Group> {}
  12. export interface ContextMenuGroupLabelProps extends ComponentProps<typeof Kobalte.GroupLabel> {}
  13. export interface ContextMenuItemProps extends ComponentProps<typeof Kobalte.Item> {}
  14. export interface ContextMenuItemLabelProps extends ComponentProps<typeof Kobalte.ItemLabel> {}
  15. export interface ContextMenuItemDescriptionProps extends ComponentProps<typeof Kobalte.ItemDescription> {}
  16. export interface ContextMenuItemIndicatorProps extends ComponentProps<typeof Kobalte.ItemIndicator> {}
  17. export interface ContextMenuRadioGroupProps extends ComponentProps<typeof Kobalte.RadioGroup> {}
  18. export interface ContextMenuRadioItemProps extends ComponentProps<typeof Kobalte.RadioItem> {}
  19. export interface ContextMenuCheckboxItemProps extends ComponentProps<typeof Kobalte.CheckboxItem> {}
  20. export interface ContextMenuSubProps extends ComponentProps<typeof Kobalte.Sub> {}
  21. export interface ContextMenuSubTriggerProps extends ComponentProps<typeof Kobalte.SubTrigger> {}
  22. export interface ContextMenuSubContentProps extends ComponentProps<typeof Kobalte.SubContent> {}
  23. function ContextMenuRoot(props: ContextMenuProps) {
  24. return <Kobalte {...props} data-component="context-menu" />
  25. }
  26. function ContextMenuTrigger(props: ParentProps<ContextMenuTriggerProps>) {
  27. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  28. return (
  29. <Kobalte.Trigger
  30. {...rest}
  31. data-slot="context-menu-trigger"
  32. classList={{
  33. ...(local.classList ?? {}),
  34. [local.class ?? ""]: !!local.class,
  35. }}
  36. >
  37. {local.children}
  38. </Kobalte.Trigger>
  39. )
  40. }
  41. function ContextMenuIcon(props: ParentProps<ContextMenuIconProps>) {
  42. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  43. return (
  44. <Kobalte.Icon
  45. {...rest}
  46. data-slot="context-menu-icon"
  47. classList={{
  48. ...(local.classList ?? {}),
  49. [local.class ?? ""]: !!local.class,
  50. }}
  51. >
  52. {local.children}
  53. </Kobalte.Icon>
  54. )
  55. }
  56. function ContextMenuPortal(props: ContextMenuPortalProps) {
  57. return <Kobalte.Portal {...props} />
  58. }
  59. function ContextMenuContent(props: ParentProps<ContextMenuContentProps>) {
  60. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  61. return (
  62. <Kobalte.Content
  63. {...rest}
  64. data-component="context-menu-content"
  65. classList={{
  66. ...(local.classList ?? {}),
  67. [local.class ?? ""]: !!local.class,
  68. }}
  69. >
  70. {local.children}
  71. </Kobalte.Content>
  72. )
  73. }
  74. function ContextMenuArrow(props: ContextMenuArrowProps) {
  75. const [local, rest] = splitProps(props, ["class", "classList"])
  76. return (
  77. <Kobalte.Arrow
  78. {...rest}
  79. data-slot="context-menu-arrow"
  80. classList={{
  81. ...(local.classList ?? {}),
  82. [local.class ?? ""]: !!local.class,
  83. }}
  84. />
  85. )
  86. }
  87. function ContextMenuSeparator(props: ContextMenuSeparatorProps) {
  88. const [local, rest] = splitProps(props, ["class", "classList"])
  89. return (
  90. <Kobalte.Separator
  91. {...rest}
  92. data-slot="context-menu-separator"
  93. classList={{
  94. ...(local.classList ?? {}),
  95. [local.class ?? ""]: !!local.class,
  96. }}
  97. />
  98. )
  99. }
  100. function ContextMenuGroup(props: ParentProps<ContextMenuGroupProps>) {
  101. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  102. return (
  103. <Kobalte.Group
  104. {...rest}
  105. data-slot="context-menu-group"
  106. classList={{
  107. ...(local.classList ?? {}),
  108. [local.class ?? ""]: !!local.class,
  109. }}
  110. >
  111. {local.children}
  112. </Kobalte.Group>
  113. )
  114. }
  115. function ContextMenuGroupLabel(props: ParentProps<ContextMenuGroupLabelProps>) {
  116. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  117. return (
  118. <Kobalte.GroupLabel
  119. {...rest}
  120. data-slot="context-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 ContextMenuItem(props: ParentProps<ContextMenuItemProps>) {
  131. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  132. return (
  133. <Kobalte.Item
  134. {...rest}
  135. data-slot="context-menu-item"
  136. classList={{
  137. ...(local.classList ?? {}),
  138. [local.class ?? ""]: !!local.class,
  139. }}
  140. >
  141. {local.children}
  142. </Kobalte.Item>
  143. )
  144. }
  145. function ContextMenuItemLabel(props: ParentProps<ContextMenuItemLabelProps>) {
  146. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  147. return (
  148. <Kobalte.ItemLabel
  149. {...rest}
  150. data-slot="context-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 ContextMenuItemDescription(props: ParentProps<ContextMenuItemDescriptionProps>) {
  161. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  162. return (
  163. <Kobalte.ItemDescription
  164. {...rest}
  165. data-slot="context-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 ContextMenuItemIndicator(props: ParentProps<ContextMenuItemIndicatorProps>) {
  176. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  177. return (
  178. <Kobalte.ItemIndicator
  179. {...rest}
  180. data-slot="context-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 ContextMenuRadioGroup(props: ParentProps<ContextMenuRadioGroupProps>) {
  191. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  192. return (
  193. <Kobalte.RadioGroup
  194. {...rest}
  195. data-slot="context-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 ContextMenuRadioItem(props: ParentProps<ContextMenuRadioItemProps>) {
  206. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  207. return (
  208. <Kobalte.RadioItem
  209. {...rest}
  210. data-slot="context-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 ContextMenuCheckboxItem(props: ParentProps<ContextMenuCheckboxItemProps>) {
  221. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  222. return (
  223. <Kobalte.CheckboxItem
  224. {...rest}
  225. data-slot="context-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 ContextMenuSub(props: ContextMenuSubProps) {
  236. return <Kobalte.Sub {...props} />
  237. }
  238. function ContextMenuSubTrigger(props: ParentProps<ContextMenuSubTriggerProps>) {
  239. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  240. return (
  241. <Kobalte.SubTrigger
  242. {...rest}
  243. data-slot="context-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 ContextMenuSubContent(props: ParentProps<ContextMenuSubContentProps>) {
  254. const [local, rest] = splitProps(props, ["class", "classList", "children"])
  255. return (
  256. <Kobalte.SubContent
  257. {...rest}
  258. data-component="context-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 ContextMenu = Object.assign(ContextMenuRoot, {
  269. Trigger: ContextMenuTrigger,
  270. Icon: ContextMenuIcon,
  271. Portal: ContextMenuPortal,
  272. Content: ContextMenuContent,
  273. Arrow: ContextMenuArrow,
  274. Separator: ContextMenuSeparator,
  275. Group: ContextMenuGroup,
  276. GroupLabel: ContextMenuGroupLabel,
  277. Item: ContextMenuItem,
  278. ItemLabel: ContextMenuItemLabel,
  279. ItemDescription: ContextMenuItemDescription,
  280. ItemIndicator: ContextMenuItemIndicator,
  281. RadioGroup: ContextMenuRadioGroup,
  282. RadioItem: ContextMenuRadioItem,
  283. CheckboxItem: ContextMenuCheckboxItem,
  284. Sub: ContextMenuSub,
  285. SubTrigger: ContextMenuSubTrigger,
  286. SubContent: ContextMenuSubContent,
  287. })