ToggleGroupInput.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import * as ToggleGroup from '@radix-ui/react-toggle-group'
  2. import { TablerIcon } from '../icons'
  3. import { Tooltip } from '../Tooltip'
  4. export interface ToggleGroupInputOption {
  5. value: string
  6. icon: string
  7. tooltip?: string
  8. }
  9. interface ToggleGroupInputProps extends React.HTMLAttributes<HTMLElement> {
  10. options: ToggleGroupInputOption[]
  11. value: string
  12. onValueChange: (value: string) => void
  13. }
  14. interface ToggleGroupMultipleInputProps extends React.HTMLAttributes<HTMLElement> {
  15. options: ToggleGroupInputOption[]
  16. value: string[]
  17. onValueChange: (value: string[]) => void
  18. }
  19. export function ToggleGroupInput({ options, value, onValueChange }: ToggleGroupInputProps) {
  20. return (
  21. <ToggleGroup.Root
  22. className="tl-toggle-group-input"
  23. type="single"
  24. value={value}
  25. onValueChange={onValueChange}
  26. >
  27. {options.map(option => {
  28. return (
  29. <Tooltip content={option.tooltip} key={option.value}>
  30. <div className='inline-block'>
  31. <ToggleGroup.Item
  32. className="tl-toggle-group-input-button"
  33. value={option.value}
  34. disabled={option.value === value}
  35. >
  36. <TablerIcon name={option.icon} />
  37. </ToggleGroup.Item>
  38. </div>
  39. </Tooltip>
  40. )
  41. })}
  42. </ToggleGroup.Root>
  43. )
  44. }
  45. export function ToggleGroupMultipleInput({
  46. options,
  47. value,
  48. onValueChange,
  49. }: ToggleGroupMultipleInputProps) {
  50. return (
  51. <ToggleGroup.Root
  52. className="tl-toggle-group-input"
  53. type="multiple"
  54. value={value}
  55. onValueChange={onValueChange}
  56. >
  57. {options.map(option => {
  58. return (
  59. <ToggleGroup.Item
  60. className="tl-toggle-group-input-button"
  61. key={option.value}
  62. value={option.value}
  63. >
  64. <TablerIcon name={option.icon} />
  65. </ToggleGroup.Item>
  66. )
  67. })}
  68. </ToggleGroup.Root>
  69. )
  70. }