dropdown-menu.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import React from 'react'
  2. import {
  3. Dropdown as BS5Dropdown,
  4. DropdownToggle as BS5DropdownToggle,
  5. DropdownMenu as BS5DropdownMenu,
  6. DropdownItem as BS5DropdownItem,
  7. DropdownDivider as BS5DropdownDivider,
  8. } from 'react-bootstrap-5'
  9. import type {
  10. DropdownProps,
  11. DropdownItemProps,
  12. DropdownToggleProps,
  13. DropdownMenuProps,
  14. } from '@/features/ui/components/types/dropdown-menu-props'
  15. import MaterialIcon from '@/shared/components/material-icon'
  16. export function Dropdown({ ...props }: DropdownProps) {
  17. return <BS5Dropdown {...props} />
  18. }
  19. export function DropdownItem({
  20. active,
  21. children,
  22. description,
  23. leadingIcon,
  24. trailingIcon,
  25. ...props
  26. }: DropdownItemProps) {
  27. const trailingIconType = active ? 'check' : trailingIcon
  28. return (
  29. <li>
  30. <BS5DropdownItem
  31. active={active}
  32. className={description ? 'dropdown-item-description-container' : ''}
  33. role="menuitem"
  34. {...props}
  35. >
  36. {leadingIcon && (
  37. <MaterialIcon
  38. className="dropdown-item-leading-icon"
  39. type={leadingIcon}
  40. />
  41. )}
  42. {children}
  43. {trailingIconType && (
  44. <MaterialIcon
  45. className="dropdown-item-trailing-icon"
  46. type={trailingIconType}
  47. />
  48. )}
  49. {description && (
  50. <span className="dropdown-item-description">{description}</span>
  51. )}
  52. </BS5DropdownItem>
  53. </li>
  54. )
  55. }
  56. export function DropdownToggle({ ...props }: DropdownToggleProps) {
  57. return <BS5DropdownToggle {...props} />
  58. }
  59. export function DropdownMenu({ as = 'ul', ...props }: DropdownMenuProps) {
  60. return <BS5DropdownMenu as={as} role="menubar" {...props} />
  61. }
  62. export function DropdownDivider() {
  63. return <BS5DropdownDivider aria-hidden="true" />
  64. }