Table.tsx106 lines · main
1import type { PropsWithChildren, ReactNode } from 'react'
2
3interface TableProps {
4 body: ReactNode
5 head?: ReactNode
6 className?: string
7 containerClassName?: string
8 borderless?: boolean
9 headTrClasses?: string
10 bodyClassName?: string
11 style?: React.StyleHTMLAttributes<HTMLTableElement>
12}
13
14/**
15 * @deprecated Use `Table` from `ui` instead
16 */
17function Table({
18 body,
19 head,
20 className,
21 containerClassName,
22 borderless,
23 headTrClasses,
24 bodyClassName,
25 style,
26}: TableProps) {
27 let containerClasses = ['table-container']
28 if (containerClassName) containerClasses.push(containerClassName)
29 if (borderless) containerClasses.push('table-container--borderless')
30
31 let classes = ['table']
32 if (className) classes.push(className)
33
34 return (
35 <div className={containerClasses.join(' ')}>
36 <table className={classes.join(' ')} style={style}>
37 <thead>
38 <tr className={headTrClasses}>{head}</tr>
39 </thead>
40 <tbody className={bodyClassName}>{body}</tbody>
41 </table>
42 </div>
43 )
44}
45
46interface ThProps {
47 className?: string
48 style?: React.CSSProperties
49}
50
51/**
52 * @deprecated Use `TableHeader` from `ui` instead
53 */
54const Th = ({ children, className, style }: PropsWithChildren<ThProps>) => {
55 const classes = ['p-3 px-4 text-left']
56 if (className) classes.push(className)
57 return (
58 <th className={classes.join(' ')} style={style}>
59 {children}
60 </th>
61 )
62}
63
64interface TrProps {
65 className?: string
66 hoverable?: boolean
67 style?: React.CSSProperties
68 onClick?: () => void
69}
70
71/**
72 * @deprecated Use `TableRow` from `ui` instead
73 */
74const Tr = ({ children, className, onClick, style, hoverable }: PropsWithChildren<TrProps>) => {
75 let classes = [className]
76 if (onClick || hoverable) classes.push('tr--link')
77 return (
78 <tr className={classes.join(' ')} onClick={onClick} style={style}>
79 {children}
80 </tr>
81 )
82}
83
84interface TdProps extends React.HTMLProps<HTMLTableCellElement> {
85 colSpan?: number
86 className?: string
87 style?: React.CSSProperties
88 align?: 'left' | 'center' | 'right' | 'justify' | 'char' | undefined
89}
90
91/**
92 * @deprecated Use `TableCell` from `ui` instead
93 */
94const Td = ({ children, colSpan, className, style, ...rest }: PropsWithChildren<TdProps>) => {
95 return (
96 <td className={className} colSpan={colSpan} style={style} {...rest}>
97 {children}
98 </td>
99 )
100}
101
102Table.th = Th
103Table.td = Td
104Table.tr = Tr
105
106export default Table