|
1 | 1 | import clsx from 'clsx'; |
2 | | -import type { FC, HTMLProps } from 'react'; |
| 2 | +import type { HTMLProps } from 'react'; |
| 3 | +import { forwardRef } from 'react'; |
3 | 4 |
|
4 | | -export type CardProps = HTMLProps<HTMLDivElement>; |
| 5 | +export type CardProps = Omit<HTMLProps<HTMLDivElement>, 'ref'>; |
5 | 6 |
|
6 | | -const Header: FC<CardProps> = ({ className, ...rest }) => ( |
| 7 | +const Header = forwardRef<HTMLDivElement, CardProps>(({ className, ...rest }, ref) => ( |
7 | 8 | <div |
8 | 9 | className={clsx( |
9 | 10 | 'tw:px-4 tw:py-3 tw:rounded-t-md', |
10 | 11 | 'tw:bg-lm-primary tw:dark:bg-dm-primary tw:border-b tw:border-lm-border tw:dark:border-dm-border', |
11 | 12 | className, |
12 | 13 | )} |
13 | 14 | {...rest} |
| 15 | + ref={ref} |
14 | 16 | /> |
15 | | -); |
| 17 | +)); |
16 | 18 |
|
17 | | -const Body: FC<CardProps> = ({ className, ...rest }) => ( |
| 19 | +const Body = forwardRef<HTMLDivElement, CardProps>(({ className, ...rest }, ref) => ( |
18 | 20 | <div |
19 | 21 | className={clsx( |
20 | 22 | 'tw:p-4 tw:bg-lm-primary tw:dark:bg-dm-primary tw:first:rounded-t-md', |
21 | 23 | 'tw:first:rounded-t-md tw:last:rounded-b-md', |
22 | 24 | className, |
23 | 25 | )} |
24 | 26 | {...rest} |
| 27 | + ref={ref} |
25 | 28 | /> |
26 | | -); |
| 29 | +)); |
27 | 30 |
|
28 | | -const Footer: FC<CardProps> = ({ className, ...rest }) => ( |
| 31 | +const Footer = forwardRef<HTMLDivElement, CardProps>(({ className, ...rest }, ref) => ( |
29 | 32 | <div |
30 | 33 | className={clsx( |
31 | 34 | 'tw:px-4 tw:py-3 tw:rounded-b-md', |
32 | 35 | 'tw:bg-lm-primary tw:dark:bg-dm-primary tw:border-t tw:border-lm-border tw:dark:border-dm-border', |
33 | 36 | className, |
34 | 37 | )} |
35 | 38 | {...rest} |
| 39 | + ref={ref} |
36 | 40 | /> |
37 | | -); |
| 41 | +)); |
38 | 42 |
|
39 | | -const BaseCard: FC<CardProps> = ({ className, ...props }) => ( |
| 43 | +const BaseCard = forwardRef<HTMLDivElement, CardProps>(({ className, ...props }, ref) => ( |
40 | 44 | <div |
41 | 45 | className={clsx( |
42 | 46 | 'tw:group/card tw:rounded-md tw:shadow-md', |
43 | 47 | 'tw:border tw:border-lm-border tw:dark:border-dm-border tw:bg-lm-primary tw:dark:bg-dm-primary', |
44 | 48 | className)} |
45 | 49 | {...props} |
| 50 | + ref={ref} |
46 | 51 | /> |
47 | | -); |
| 52 | +)); |
48 | 53 |
|
49 | 54 | export const Card = Object.assign(BaseCard, { Body, Header, Footer }); |
0 commit comments