← full-stack-fastapi-template  /  frontend/src/components/ui/table.tsx

1
import * as React from "react"
2
3
import { cn } from "@/lib/utils"
4
5
function Table({ className, ...props }: React.ComponentProps<"table">) {
6
  return (
7
    <div
8
      data-slot="table-container"
9
      className="relative w-full overflow-x-auto rounded-lg border"
10
    >
11
      <table
12
        data-slot="table"
13
        className={cn("w-full caption-bottom text-sm", className)}
14
        {...props}
15
      />
16
    </div>
17
  )
18
}
19
20
function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
21
  return (
22
    <thead
23
      data-slot="table-header"
24
      className={cn("bg-muted/50 [&_tr]:border-b", className)}
25
      {...props}
26
    />
27
  )
28
}
29
30
function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
31
  return (
32
    <tbody
33
      data-slot="table-body"
34
      className={cn("[&_tr:last-child]:border-0", className)}
35
      {...props}
36
    />
37
  )
38
}
39
40
function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
41
  return (
42
    <tfoot
43
      data-slot="table-footer"
44
      className={cn(
45
        "bg-muted/50 border-t font-medium [&>tr]:last:border-b-0",
46
        className
47
      )}
48
      {...props}
49
    />
50
  )
51
}
52
53
function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
54
  return (
55
    <tr
56
      data-slot="table-row"
57
      className={cn(
58
        "hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",
59
        className
60
      )}
61
      {...props}
62
    />
63
  )
64
}
65
66
function TableHead({ className, ...props }: React.ComponentProps<"th">) {
67
  return (
68
    <th
69
      data-slot="table-head"
70
      className={cn(
71
        "text-muted-foreground h-11 px-4 text-left align-middle text-xs font-semibold uppercase tracking-wider whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
72
        className
73
      )}
74
      {...props}
75
    />
76
  )
77
}
78
79
function TableCell({ className, ...props }: React.ComponentProps<"td">) {
80
  return (
81
    <td
82
      data-slot="table-cell"
83
      className={cn(
84
        "px-4 py-3 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
85
        className
86
      )}
87
      {...props}
88
    />
89
  )
90
}
91
92
function TableCaption({
93
  className,
94
  ...props
95
}: React.ComponentProps<"caption">) {
96
  return (
97
    <caption
98
      data-slot="table-caption"
99
      className={cn("text-muted-foreground mt-4 text-sm", className)}
100
      {...props}
101
    />
102
  )
103
}
104
105
export {
106
  Table,
107
  TableHeader,
108
  TableBody,
109
  TableFooter,
110
  TableHead,
111
  TableRow,
112
  TableCell,
113
  TableCaption,
114
}
115