collapsible-alert.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. 'use client'
  2. import { type VariantProps } from 'class-variance-authority'
  3. import { ChevronDown } from 'lucide-react'
  4. import * as React from 'react'
  5. import { Button, cn } from 'ui'
  6. import { alertVariants } from 'ui/src/components/shadcn/ui/alert'
  7. import {
  8. Collapsible,
  9. CollapsibleContent,
  10. CollapsibleTrigger,
  11. } from 'ui/src/components/shadcn/ui/collapsible'
  12. export interface CollapsibleAlertProps
  13. extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>, VariantProps<typeof alertVariants> {
  14. trigger: React.ReactNode
  15. defaultOpen?: boolean
  16. }
  17. const CollapsibleAlert = React.forwardRef<HTMLDivElement, CollapsibleAlertProps>(
  18. ({ className, variant = 'default', trigger, defaultOpen, children, ...props }, ref) => (
  19. <div
  20. ref={ref}
  21. className={cn(
  22. alertVariants({ variant }),
  23. // Override default padding to be tighter
  24. 'p-3',
  25. className
  26. )}
  27. {...props}
  28. >
  29. <Collapsible defaultOpen={defaultOpen}>
  30. <div className="flex items-center justify-between gap-2">
  31. <span className="font-medium">{trigger}</span>
  32. <CollapsibleTrigger asChild>
  33. <Button
  34. type="outline"
  35. size="tiny"
  36. className={cn('px-0! w-[26px]', '[&[data-state=open]_svg]:rotate-180')}
  37. aria-label="Toggle"
  38. icon={<ChevronDown className="transition-transform duration-200" />}
  39. />
  40. </CollapsibleTrigger>
  41. </div>
  42. <CollapsibleContent className="pt-3">{children}</CollapsibleContent>
  43. </Collapsible>
  44. </div>
  45. )
  46. )
  47. CollapsibleAlert.displayName = 'CollapsibleAlert'
  48. export { CollapsibleAlert }