|
1 | 1 | import * as React from "react"; |
2 | 2 | import { parsePadding, pxToPt } from "./utils"; |
3 | 3 |
|
| 4 | +type ButtonElement = React.ElementRef<"a">; |
4 | 5 | export type ButtonProps = React.ComponentPropsWithoutRef<"a">; |
5 | 6 |
|
6 | | -export const Button: React.FC<Readonly<ButtonProps>> = ({ |
7 | | - children, |
8 | | - style, |
9 | | - target = "_blank", |
10 | | - ...props |
11 | | -}) => { |
12 | | - const { pt, pr, pb, pl } = parsePadding({ |
13 | | - padding: style?.padding, |
14 | | - paddingLeft: style?.paddingLeft, |
15 | | - paddingRight: style?.paddingRight, |
16 | | - paddingTop: style?.paddingTop, |
17 | | - paddingBottom: style?.paddingBottom, |
18 | | - }); |
| 7 | +export const Button = React.forwardRef<ButtonElement, Readonly<ButtonProps>>( |
| 8 | + ({ children, style, target = "_blank", ...props }, ref) => { |
| 9 | + const { pt, pr, pb, pl } = parsePadding({ |
| 10 | + padding: style?.padding, |
| 11 | + paddingLeft: style?.paddingLeft, |
| 12 | + paddingRight: style?.paddingRight, |
| 13 | + paddingTop: style?.paddingTop, |
| 14 | + paddingBottom: style?.paddingBottom, |
| 15 | + }); |
19 | 16 |
|
20 | | - const y = pt + pb; |
21 | | - const textRaise = pxToPt(y); |
| 17 | + const y = pt + pb; |
| 18 | + const textRaise = pxToPt(y); |
22 | 19 |
|
23 | | - return ( |
24 | | - <a |
25 | | - {...props} |
26 | | - style={buttonStyle({ ...style, pt, pr, pb, pl })} |
27 | | - target={target} |
28 | | - > |
29 | | - <span |
30 | | - dangerouslySetInnerHTML={{ |
31 | | - __html: `<!--[if mso]><i style="letter-spacing: ${pl}px;mso-font-width:-100%;mso-text-raise:${textRaise}" hidden> </i><![endif]-->`, |
32 | | - }} |
33 | | - /> |
34 | | - <span style={buttonTextStyle(pb)}>{children}</span> |
35 | | - <span |
36 | | - dangerouslySetInnerHTML={{ |
37 | | - __html: `<!--[if mso]><i style="letter-spacing: ${pr}px;mso-font-width:-100%" hidden> </i><![endif]-->`, |
38 | | - }} |
39 | | - /> |
40 | | - </a> |
41 | | - ); |
42 | | -}; |
| 20 | + return ( |
| 21 | + <a |
| 22 | + {...props} |
| 23 | + ref={ref} |
| 24 | + style={buttonStyle({ ...style, pt, pr, pb, pl })} |
| 25 | + target={target} |
| 26 | + > |
| 27 | + <span |
| 28 | + dangerouslySetInnerHTML={{ |
| 29 | + __html: `<!--[if mso]><i style="letter-spacing: ${pl}px;mso-font-width:-100%;mso-text-raise:${textRaise}" hidden> </i><![endif]-->`, |
| 30 | + }} |
| 31 | + /> |
| 32 | + <span style={buttonTextStyle(pb)}>{children}</span> |
| 33 | + <span |
| 34 | + dangerouslySetInnerHTML={{ |
| 35 | + __html: `<!--[if mso]><i style="letter-spacing: ${pr}px;mso-font-width:-100%" hidden> </i><![endif]-->`, |
| 36 | + }} |
| 37 | + /> |
| 38 | + </a> |
| 39 | + ); |
| 40 | + }, |
| 41 | +); |
| 42 | + |
| 43 | +Button.displayName = "Button"; |
43 | 44 |
|
44 | 45 | const buttonStyle = ( |
45 | 46 | style?: React.CSSProperties & { |
|
0 commit comments