summaryrefslogtreecommitdiff
path: root/components/ui/dropzone.tsx
blob: a72826d93b22f8998872fdb04b7de42a284baae0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"use client"

import * as React from "react"
import { Primitive } from "@radix-ui/react-primitive"
import { Ban, CheckCircle2, Upload } from "lucide-react"

import { cn } from "@/lib/utils"
import * as DropzonePrimitive from "@/components/ui/dropzone-primitive"

export const Dropzone = DropzonePrimitive.Dropzone

export const DropzoneInput = DropzonePrimitive.Input

export const DropzoneZone = React.forwardRef<
  React.ElementRef<typeof DropzonePrimitive.Zone>,
  React.ComponentPropsWithoutRef<typeof DropzonePrimitive.Zone>
>(({ className, ...props }, ref) => (
  <DropzonePrimitive.Zone
    ref={ref}
    className={cn(
      "cursor-pointer rounded-md border-2 border-dashed border-input p-6 shadow-sm transition-colors hover:border-accent-foreground/50 hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring data-[disabled]:cursor-not-allowed data-[drag-reject]:cursor-no-drop data-[no-click]:cursor-default data-[disabled]:border-inherit data-[drag-active]:border-accent-foreground/50 data-[drag-reject]:border-destructive data-[disabled]:bg-inherit data-[drag-active]:bg-accent data-[drag-reject]:bg-destructive/30 data-[disabled]:opacity-50",
      className
    )}
    {...props}
  />
))
DropzoneZone.displayName = "DropzoneZone"

export const DropzoneUploadIcon = React.forwardRef<
  React.ElementRef<typeof Upload>,
  React.ComponentPropsWithoutRef<typeof Upload>
>(({ className, ...props }, ref) => (
  <>
    <DropzonePrimitive.DragAccepted>
      <CheckCircle2 ref={ref} className={cn("size-8", className)} {...props} />
    </DropzonePrimitive.DragAccepted>
    <DropzonePrimitive.DragRejected>
      <Ban ref={ref} className={cn("size-8", className)} {...props} />
    </DropzonePrimitive.DragRejected>
    <DropzonePrimitive.DragDefault>
      <Upload ref={ref} className={cn("size-8", className)} {...props} />
    </DropzonePrimitive.DragDefault>
  </>
))
DropzoneUploadIcon.displayName = "DropzoneUploadIcon"

export const DropzoneGroup = React.forwardRef<
  React.ElementRef<typeof Primitive.div>,
  React.ComponentPropsWithoutRef<typeof Primitive.div>
>(({ className, ...props }, ref) => (
  <Primitive.div
    ref={ref}
    className={cn("grid place-items-center gap-1.5", className)}
    {...props}
  />
))
DropzoneGroup.displayName = "DropzoneGroup"

export const DropzoneTitle = React.forwardRef<
  React.ElementRef<typeof Primitive.h3>,
  React.ComponentPropsWithoutRef<typeof Primitive.h3>
>(({ className, ...props }, ref) => (
  <Primitive.h3
    ref={ref}
    className={cn("font-medium leading-none tracking-tight", className)}
    {...props}
  />
))
DropzoneTitle.displayName = "DropzoneTitle"

export const DropzoneDescription = React.forwardRef<
  React.ElementRef<typeof Primitive.p>,
  React.ComponentPropsWithoutRef<typeof Primitive.p>
>(({ className, ...props }, ref) => (
  <Primitive.p
    ref={ref}
    className={cn("text-sm text-muted-foreground", className)}
    {...props}
  />
))
DropzoneDescription.displayName = "DropzoneDescription"

export const DropzoneTrigger = DropzonePrimitive.Trigger

export const DropzoneAccepted = DropzonePrimitive.Accepted

export const DropzoneRejected = DropzonePrimitive.Rejected